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.

  • 🔘 Definición: Para un número de n dígitos, cada dígito se eleva a la potencia n y los resultados se suman.
  • ☑️ Ejemplo trabajado: 370 cumple los requisitos porque 3³ más 7³ más 0³ da como resultado exactamente 370.
  • Digit Extracción: El operador módulo elimina el último dígito y la división entera acorta el número en cada pasada.
  • 🧪 Dos programas: Una prueba un valor fijo de 153, la otra recorre todos los números del 0 al 999.
  • 🛠️ Límite conocido: Elevar al cubo cada dígito solo funciona para valores de tres dígitos, por lo que para rangos más amplios se necesita la potencia de n.
  • 📊 Complejidad: Ambos programas se ejecutan en un tiempo O(d) por número y utilizan O(1) de memoria adicional.

Número de Armstrong en Java programa que utiliza un bucle for

¿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.

  1. Copie la entrada en un archivo de trabajo. variable De esta forma, el valor original se conserva para la comparación final.
  2. Toma el último dígito con el operador módulo, digit = tempNumber % 10.
  3. Eleva ese dígito a la potencia del número de dígitos y agrégalo a un total acumulado.
  4. Elimine el último dígito con la división entera, tempNumber /= 10.
  5. 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.

Preguntas Frecuentes

Sí. Elevar cada dígito al cubo da 27 + 343 + 1, lo que suma 371, por lo que el valor se reproduce. El programa de rango anterior lo imprime junto con 153, 370 y 407.

El nombre refleja la propiedad misma: el número se construye enteramente a partir de sus propios dígitos, por lo que parece admirar su propio reflejo. Ambos términos describen la misma regla, y la suma de potencias de dígitos a veces se denomina invariante digital pluscuamperfecto.

Hay tres: 1634, 8208 y 9474. Cada dígito se eleva a la cuarta potencia porque el valor tiene cuatro dígitos. El código basado en cubos no puede detectarlos, por lo que el exponente debe seguir al número de dígitos.

Un número perfecto es igual a la suma de sus divisores propios, por lo que el 6 cumple con esta condición mediante 1 + 2 + 3. Un número de Armstrong es igual a la suma de las potencias de sus dígitos. Ambas definiciones no comparten ninguna operación aritmética y rara vez coinciden.

Math.pow() devuelve un valor double, por lo que se requiere una conversión a int y pueden producirse errores de redondeo. Para un cubo fijo, digit*digit*digit es más rápido y exacto. Math.pow() solo justifica su uso cuando el exponente varía con el número de dígitos.

Sí. Un método auxiliar puede tomar el valor de trabajo, sumar el último dígito potenciado a un acumulador y llamarse a sí mismo con el número dividido por 10. Se lee bien, aunque la versión con bucle evita los marcos de pila adicionales.

Los asistentes modernos pueden producir un pase de desvío trace) reformule el bucle en lenguaje sencillo y sugiera casos límite como 0 o una entrada negativa. Verifique el trace en contra de la salida real de la consola, porque los tutoriales generados a veces omiten una iteración.

Copiloto de GitHub Por lo general, completa el bucle solo con el nombre del método, pero a menudo codifica el cubo directamente. Indique el número de dígitos requerido en la solicitud, luego compile y pruebe la sugerencia antes de confiar en ella.

Resumir este post con: