Número de Armstrong en un programa JAVA que utiliza un bucle For
⚡ Resumen inteligente
Los números de Armstrong son iguales a la suma de sus propios dígitos elevados a la potencia del número de dígitos, y los dos Java Los programas que se muestran a continuación comprueban un único valor y enumeran todos los números de Armstrong inferiores a mil.
¿Qué es el número Armstrong?
En un número de Armstrong, la suma de las potencias de los dígitos individuales es igual al número mismo.
En otras palabras, la siguiente ecuación será válida
xy..z = xn + yn+.....+ zn
n es el número de dígitos en el número
Por ejemplo, este es un número Armstrong de 3 dígitos.
370 = 33 + 73 + 03 = 27 + 343 + 0 = 370
Ejemplos de Armstrong Numbers
0, 1, 4, 5, 9, 153, 371, 407, 8208, etc.
Cada dígito del 0 al 9 cumple la regla de forma trivial, ya que un dígito elevado a la primera potencia se reproduce a sí mismo. El conjunto completo de números de Armstrong de tres dígitos es 153, 370, 371 y 407, mientras que 1634, 8208 y 9474 son los de cuatro dígitos. Los matemáticos también denominan a estos valores números narcisistas, puesto que cada uno se reproduce a partir de sus propios dígitos.
Escribamos esto en un programa:
Cómo funciona el algoritmo numérico de Armstrong
Antes de leer el código, conviene observar las operaciones aritméticas que ambos programas repiten. La comprobación solo requiere tres operaciones: eliminar el último dígito, elevarlo a la potencia requerida y restarle un dígito al número.
- Copie la entrada en un archivo de trabajo. variable De esta forma, el valor original se conserva para la comparación final.
- Toma el último dígito con el operador módulo,
digit = tempNumber % 10. - Eleva ese dígito a la potencia del número de dígitos y agrégalo a un total acumulado.
- Elimine el último dígito con la división entera,
tempNumber /= 10. - Repita el proceso hasta que la variable de trabajo llegue a 0, y luego compare el total acumulado con el número original.
Ejecutar esos pasos durante 153 produce el trace a continuación. Cada valor de la tabla es impreso por el primer programa, por lo que la salida se puede comparar línea por línea mientras se aprende el bucle.
| Pasó | Número de temperatura | dígito | digitCubeSum |
| 1 | 153 | 3 | 27 |
| 2 | 15 | 5 | 152 |
| 3 | 1 | 1 | 153 |
| Exit | 0 | – | 153 es igual a 153, por lo tanto, 153 es un número de Armstrong. |
Una limitación importante. Ambos programas multiplican el dígito por sí mismo tres veces, lo cual es correcto solo cuando la entrada tiene exactamente tres dígitos. La regla general eleva cada dígito a la potencia n, donde n es la cantidad de dígitos, por lo que un valor de cuatro dígitos como 8208 necesita una cuarta potencia y no sería detectado por un código basado en cubos. Contar primero los dígitos y elevar cada uno a esa potencia es lo que convierte la rutina en una prueba general.
Una vez aclarado el cálculo aritmético, el primer programa lo aplica a un único valor predefinido.
Java Programa para comprobar si un número es un número Armstrong
La clase siguiente almacena el candidato en inputArmstrongNumber y imprime las variables de trabajo en cada pasada, lo que hace que la Java Bucle fácil de seguir en una consola.
//ChecktempNumber is Armstrong or not using while loop package com.guru99; public class ArmstrongNumber { public static void main(String[] args) { int inputArmstrongNumber = 153; //Input number to check armstrong int tempNumber, digit, digitCubeSum = 0; tempNumber = inputArmstrongNumber; while (tempNumber != 0) { /* On each iteration, remainder is powered by thetempNumber of digits n */ System.out.println("Current Number is "+tempNumber); digit =tempNumber % 10; System.out.println("Current Digit is "+digit); //sum of cubes of each digits is equal to thetempNumber itself digitCubeSum = digitCubeSum + digit*digit*digit; System.out.println("Current digitCubeSum is "+digitCubeSum); tempNumber /= 10; } //check giventempNumber and digitCubeSum is equal to or not if(digitCubeSum == inputArmstrongNumber) System.out.println(inputArmstrongNumber + " is an Armstrong Number"); else System.out.println(inputArmstrongNumber + " is not an Armstrong Number"); } }
Compila y ejecuta la clase desde la raíz del proyecto. Porque el archivo declara package com.guru99debe sentarse en un lugar que combine com/guru99 carpeta, o el entorno de ejecución informa un error de clase no encontrada. Cambiar el valor en el inputArmstrongNumber La línea es todo lo que se necesita para probar otro candidato.
Resultado
Current Number is 153 Current Digit is 3 Current digitCubeSum is 27 Current Number is 15 Current Digit is 5 Current digitCubeSum is 152 Current Number is 1 Current Digit is 1 Current digitCubeSum is 153 153 is an Armstrong Number
Comprobar un valor a la vez es útil para tracing, pero la misma lógica se aplica a todo un rango mediante wrapping en un bucle exterior.
Java Programa para imprimir números Armstrong del 0 al 999
La segunda versión mantiene el mismo interior while bucle y agrega un for circuito que recorre el campo de tiro. Tenga en cuenta que digitCubeSum se restablece a 0 al comienzo de cada pasada, que es el detalle que la mayoría de los principiantes olvidan.
//ChecktempNumber is Armstrong or not using while loop package com.guru99; public class ArmstrongNumber { public static void main(String[] args) { int tempNumber, digit, digitCubeSum; for (int inputArmstrongNumber = 0; inputArmstrongNumber < 1000; inputArmstrongNumber++) { tempNumber = inputArmstrongNumber; digitCubeSum = 0; while (tempNumber != 0) { /* On each iteration, remainder is powered by thetempNumber of digits n */ digit = tempNumber % 10; //sum of cubes of each digits is equal to thetempNumber itself digitCubeSum = digitCubeSum + digit * digit * digit; tempNumber /= 10; } //check giventempNumber and digitCubeSum is equal to or not if (digitCubeSum == inputArmstrongNumber) System.out.println(inputArmstrongNumber + " is an Armstrong Number"); } } }
Resultado
0 is an Armstrong Number 1 is an Armstrong Number 153 is an Armstrong Number 370 is an Armstrong Number 371 is an Armstrong Number 407 is an Armstrong Number
La lista se detiene en 1 en lugar de continuar hasta 9 porque el cubo de un solo dígito solo coincide con el dígito mismo para 0 y 1. Elevar cada dígito a la potencia del número de dígitos devolvería los diez valores de un solo dígito, que es la misma generalización descrita anteriormente.
Ambas listas son lo suficientemente cortas como para servir de referencia, por lo que vale la pena indicar explícitamente el coste de este enfoque.
Complejidad temporal y espacial del programa de números de Armstrong
El bucle interno divide la variable de trabajo entre 10 en cada iteración, por lo que se ejecuta una vez por dígito en lugar de una vez por unidad del número. Esto hace que la comprobación de un solo valor sea extremadamente económica, y se mantiene así a medida que aumenta el valor de entrada.
| Programa | Complejidad de tiempo | Complejidad espacial |
| Marque un número | O(d), donde d es el número de dígitos. | O (1) |
| Escanee un rango de N números | O(N × d) | O (1) |
Porque d es igual a log10(número) redondeado hacia arriba, la única comprobación es efectivamente logarítmica en el valor que se está probando. Solo tres int Nunca se asigna espacio a las variables, y no se crea ninguna matriz ni colección, por lo que el coste de espacio permanece constante independientemente del tamaño del rango.
De esto se derivan dos observaciones prácticas. Primero, el escaneo de rango está dominado por N, por lo que imprimir números Armstrong hasta un millón cuesta aproximadamente mil veces más que imprimirlos hasta mil. Segundo, un int desborda por encima de 2,147,483,647, por lo que una búsqueda en rangos muy grandes necesita long para el candidato y la suma acumulada. El mismo dígito-extracEl patrón de ción aparece en muchos ejercicios para principiantes, incluyendo el comprobación de números primos, Serie de Fibonacci programas y taladros de matriz tales como ordenamiento de burbuja y tipo de inserción.
