Fácil–medio · dígitos
Número de Armstrong
El 153 es famoso porque 1³ + 5³ + 3³ = 153. Generaliza: cuenta las cifras, luego eleva cada una a esa potencia y suma. Suma de cifras es el calentamiento.
En una fraseUn número de n cifras es de Armstrong si la suma de sus cifras elevadas a n da el propio número (153 = 1³ + 5³ + 3³): primero cuenta las cifras y luego recorre otra vez para sumar las potencias.
El problema
Entrada: un entero N (1 ≤ N ≤ 10⁶).
Salida: yes si N es un número de Armstrong, si no no.
Ejemplos:
| Entrada | Salida |
|---|---|
153 | yes |
123 | no |
9474 | yes |
Tu solución
Entrada personalizada para «Ejecutar mi entrada»
La corrección corre en tu navegador contra pruebas ocultas. Un bucle infinito se corta a los 3 segundos — aun así, asegúrate de que todo bucle tenga salida. Tu código se guarda solo mientras escribes.
¿Atascado? Pistas
Pista 1 — dos pasadas
Primera pasada: copia n en un temporal, divídelo entre 10 hasta que valga 0, contando cuántas cifras d viste. Segunda pasada: extrae cada cifra con % 10, elévala a la d-ésima potencia (un buclecito interior) y súmala a un total.
Pista 2 — no necesitas pow()
JSCPP no tiene <cmath>, así que calcula la potencia con un bucle (multiplica digit por sí mismo d veces). Guarda la suma en long long — 999999 tiene 6 cifras y 9⁶ × 6 supera un int de 32 bits.
Solución (¡inténtalo primero!)
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int t = n, d = 0;
while (t) { d++; t /= 10; }
t = n;
long long sum = 0;
while (t) {
int dig = t % 10;
long long p = 1;
for (int i = 0; i < d; i++) p *= dig;
sum += p;
t /= 10;
}
cout << (sum == n ? "yes" : "no") << endl;
return 0;
}
Reto: imprime todos los números de Armstrong por debajo de 1000000, o maneja explícitamente el caso de una cifra (cada uno lo es). Relacionado: Suma de cifras, MCM.
Análisis profundo
Por qué funciona
Necesitas contar las cifras antes de poder calcular nada, así que la forma natural son dos pasadas: una para medir, otra para sumar. Dividir un problema en «qué necesito saber primero» es la habilidad que se transfiere.
El coste
O(d) de tiempo, con d el número de cifras (como mucho 7 aquí), O(1) de espacio. El bucle interior de potencia corre d veces por cifra, d² en total: sigue siendo trivial.
Dónde falla
- Usar
pow(digit, d)de<cmath>: JSCPP no lo trae; escribe el pequeño bucle de multiplicaciones. - Guardar la suma en
int: 9⁶ × 6 = 3.188.646 cabe, pero con 7 cifras se pasa del techo del int;long longaquí no cuesta nada.
Siguiente paso
Imprime todos los números de Armstrong bajo un millón (solo hay 88) reutilizando la comprobación. Mínimo común múltiplo es la otra mitad de la misma caja de herramientas.
Dos cosas para recordar
- Cuenta las cifras primero; la potencia depende de cuántas hay.
- El motor del navegador no trae
<cmath>: un bucle de tres líneas sustituye a pow().
🐞 Esta versión falla: ábrela y pruébala
Siempre eleva al cubo: acierta con 153 y falla con 9474 (cuatro cifras piden la cuarta potencia)
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int t = n, sum = 0;
while (t) {
int d = t % 10;
sum += d * d * d; // hard-coded cube: only works for 3-digit numbers
t /= 10;
}
cout << (sum == n ? "yes" : "no") << endl;
return 0;
}