Número Armstrong en PSeInt

Más ejercicios resueltos

Si deseas revisar más ejercicios resueltos, haz click en el siguiente botón. 

A continuación presentamos una alternativa de solución al problema de generación del listado de números Armstrong en PSeInt. Si deseas ver el enunciado del problema, haz click en el siguiente enlace

A continuación procederemos a presentar una alternativa de solución al problema de generación del listado de números Armstrong. Usaremos para tal solución el paradigma de programación modular. Aplicaremos además la técnica de diseño descendente. Se implementarán los siguiente módulos.

  • El módulo principal.
  • El módulo para verificar si un número es Armstrong o no.
  • El módulo para contar la cantidad de dígitos de un número.

Módulo Principal

El módulo principal básicamente lo que realiza es el control de flujo para recorrer la lista de enteros y para cada número, verifica si es Armstrong o no, usando para este fin el módulo \texttt{es\_Armstrong}. A continuación explicamos paso a paso el diseño de este módulo.

Control de flujo

El control de flujo busca recorrer los números naturales en el rango 1..límite, siendo el límite 2^{31}-1. Hemos puesto dicho límite pues en la mayoría de los lenguajes de programación, corresponde con el máximo entero que se puede representar.

Para el control de flujo se ha utilizado la instrucción \texttt{Para}. Se utiliza como variable de control a la variable \texttt{i} la cual se inicializa dentro de la instrucción con el valor de 1. El ciclo \texttt{Para} repetirá el bloque de instrucciones mientras la variable de control sea menor o igual al valor \texttt{limite}. Al final de cada iteración, la variable se incrementa en 1.

lista de Armstrong - principal-paso 1
Control de flujo

Validación de número Armstrong

Para verificar si un número es Armstrong usaremos la función \texttt{es\_Armstrong}. No nos preocupamos en este paso por la implementación de esta función, la analizaremos con detalle en la siguiente sección. Solo nos interesa saber lo que hace esta función. La función \texttt{es\_Armstrong} retornará el valor de \texttt{Verdadero} si es que el número pasado como parámetro es efectivamente Armstrong. 

Usamos este hecho para usar una selectiva simple e imprimir el número en caso sea Armstrong, implementando una especie de filtro. Este filtro solamente dejará pasar los números Armstrong.

lista de Armstrong - principal-paso 2
Validación de número Armstrong

Verificación si un número es Armstrong

Procederemos ahora a analizar la implementación de la función \texttt{es\_Armstrong}. Esta función recibe como parámetro \texttt{n} que asumimos es un número mayor que cero. La función principal debe garantizar esto. Retorna el valor \texttt{Verdadero} si la suma de cada uno de sus dígitos elevado al número total de dígitos es igual al mismo número y \texttt{Falso} en caso contrario.

Analizaremos esta función en 3 partes:

  • Primero analizaremos el control de flujo.
  • Luego veremos cómo obtenemos cada dígito del número.
  • Finalmente hallaremos la sumatoria.

Control de flujo

Dado que tenemos que hallar la suma de todos los dígitos elevado a la cantidad de dígitos de número, necesitamos obtener cada uno de los dígitos del número. Como esta operación es repetitiva, usaremos una estructura algorítmica iterativa. En este caso en particular necesitaremos conocer la cantidad de dígitos que tiene el número, por lo tanto aprovechamos esto para el control de flujo.

En primer lugar lo que hacemos es calcular la cantidad de dígitos del número. Almacenaremos este valor en la variable \texttt{total\_digitos}. El cálculo lo realizaremos usando la función \texttt{cuenta\_digitos} que nuevamente no nos preocuparemos de implementar en esta sección. Asumiremos que esta función existe y nos retorna la cantidad de dígitos del número pasado como parámetro.

Lo siguiente es iterar tantas veces como dígitos tenga el numero. Usamos la instrucción \texttt{Para} que encaja perfectamente para el control de flujo que necesitamos realizar. Usamos la variable de control \texttt{i} la cual ha sido inicializada en 1 e iteramos mientras dicha variable sea menor o igual al \texttt{total\_digitos}. En cada ciclo o paso, incrementamos en 1 la variable de control.

verifica Armstrong pao 1
Control de flujo

Obtención del dígito

Una vez que hemos controlado el flujo, procederemos a obtener cada uno de los dígitos del número. La forma de obtener los dígitos de un número es haciendo divisiones del número entre 10. El problema de hacer esto es que el número lo vamos transformando y luego no podremos compararlo para determinar si es Armstrong o no. Por este motivo, lo primero que realizamos es obtener una copia del número que deseamos analizar. Esta copia la guardamos en la variable \texttt{copia\_numero}. De esta forma, podemos modificar esta copia manteniendo el valor del parámetro intacto.

Luego, en cada iteración usamos esta copia para obtener los dígitos del número. Para obtener el dígito que corresponde con la iteración usamos el operador \texttt{mod}. La operación \texttt{copia\_numero\ mod\ 10} lo que hace es obtener el dígito que está más a la derecha en el número, el dígito de las unidades. Por ejemplo si el número fuera 153, la operación 153\ mod\ 10 retornaría el valor de 3, el dígito de las unidades.

Una vez hallado el dígito, debemos de actualizar nuestra copia del número. ¿Cómo hacemos dicha actualización? Realizando una división entera entre el numero y 10. Por ejemplo si el número fuera 153, la operación 153\ división\ entera\ 10 retornaría el valor de 15, el número sin el dígito ya procesado previamente. Lamentablemente PSeInt no posee un operando para realizar la división entera, en su lugar realizamos una división real y truncamos el resultado usando la función \texttt{trunc}.

verifica Armstrong pao 2
Obtención del dígito

Suma de potencias

El último paso a realizar es encontrar la sumatoria. Para esto usaremos una variable a la que hemos denominado \texttt{suma\_de\_potencias}. Como es una sumatoria, la hemos inicializado con el valor de 0.

En cada iteración, básicamente lo que se hace es, incrementarla con el valor del dígito obtenido elevado a la cantidad total de dígitos. Para esto usamos el operador ^ que permite elevar un número a cualquier potencia en PSeInt.

Al finalizar, hallamos el valor de la variable \texttt{verifica\_Armstrong}. Esta variable va a contener el valor de una comparación de igualdad. Los valores que se comparan son el número pasado como parámetro y la sumatoria hallada, si ambos valores son iguales, la variable se actualizará con el valor de \texttt{Verdadero} haciendo que la función retorne este valor. En caso esto no se cumpla, la función retornará el valor de \texttt{Falso}.

verifica Armstrong pao 3
Suma de potencias

Cuenta dígitos

El último paso a implementar para terminar el análisis de este ejercicio, es el cálculo de la cantidad de dígitos de un número. En realidad existen diversas maneras de calcular la cantidad de dígitos que posee un número. En esta oportunidad usaremos la versión usando los logaritmos pues se ha demostrado que es la más eficiente de todas, pero en nuestro artículo «Cantidad de dígitos de un número en PSeInt» podrá encontrar las otras versiones y la explicación detallada de cada una de ellas.

pseudocódigo cuenta dígitos con logaritmos
Cuenta dígitos

Conclusión

Hemos presentado en este artículo, una propuesta de solución al listado de los números Armstrong usando PSeInt. Se ha utilizado para el diseño algorítmico la técnica del diseño descendente y se ha controlado  el flujo en los módulos usando estructuras selectivas e iterativas. Podrá descargar la solución propuesta en el repositorio GitHub de iterando++ a través del siguiente enlace

Hemos preparado otros artículos adicionales en donde describimos al detalle la implementación de este problema en lenguajes de programación. Te invitamos a leer los siguientes artículos de iterando++

Si te interesa profundizar más sobre diseño algorítmico, te recomendamos el libro Foundations of Programming Languages de Kent D. D. Lee. En este libro encontrarás además información detallada sobre la programación orientada a objetos, funcional y lógica.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *