Power Digit Sum
215 = 32768 y la suma de sus dígitos es 3 + 2 + 7 + 6 + 8 = 26.
¿Cuál es la suma de los dígitos de 21000?
1 ¿Qué tan grande es 21000?
Empecemos por entender la magnitud del número que estamos manejando. Las potencias de 2 crecen exponencialmente.
El crecimiento exponencial:
21000 tiene 302 dígitos
Para ponerlo en perspectiva: hay aproximadamente 10⁸⁰ átomos en el universo observable. 2¹⁰⁰⁰ ≈ 10³⁰¹ es un número astronómicamente mayor.
Ejemplo: suma de dígitos de 215
El Problema: Overflow
En la mayoría de lenguajes, los enteros tienen un tamaño fijo (32 o 64 bits).
Un int64 solo puede almacenar hasta 2⁶³ - 1 ≈ 9.2×10¹⁸.
long long máximo: 2⁶³2¹⁰⁰⁰ → overflow
long máximo: 2⁶³Necesita
BigInteger
Number: solo 53 bits precisosNecesita
BigInt
2**1000 funciona directamente
El Algoritmo
- Calcular 2¹⁰⁰⁰ (Python lo hace automáticamente con precisión infinita)
- Convertir el número a string para acceder a cada dígito
- Sumar los dígitos (convertidos de vuelta a int)
2 Implementación en Python
En Python, este problema es casi trivial gracias a los enteros de precisión arbitraria. Pero entendamos exactamente qué está pasando.
Desglose del Generator Expression
sum(int(d) for d in str(2**1000))
2**1000 → calcula la potencia (Python BigInt)
str(...) → convierte a string "107150860..."
for d in ... → itera sobre cada carácter: "1", "0", "7", ...
int(d) → convierte cada carácter a entero: 1, 0, 7, ...
sum(...) → suma todos los valores generados
¿Por qué Generator y no Lista?
Observa la diferencia:
# Lista (crea 302 elementos en memoria)
sum([int(d) for d in str(2**1000)])
# Generator (genera uno a uno)
sum(int(d) for d in str(2**1000))
Para 302 dígitos la diferencia es mínima, pero es un buen hábito usar generators cuando no necesitas la lista completa.
Comparación de Métodos
| Método | Legibilidad | Rendimiento |
|---|---|---|
| sum(int(d) for d in str(n)) | Excelente | Bueno |
| Bucle con for | Excelente | Bueno |
| n % 10, n // 10 | Medio | Mejor |
Para este problema, cualquier método es suficientemente rápido. Prefiere el que te resulte más claro.
¿Cómo maneja Python números tan grandes?
Python usa una representación interna llamada "arbitrary-precision integers":
- Almacena el número como un array de "dígitos" en base 2³⁰
- Cada "dígito" cabe en un entero de 32 bits
- Para 2¹⁰⁰⁰ necesita ~34 de estos "dígitos"
- Las operaciones (suma, multiplicación) trabajan dígito por dígito
Esto es más lento que enteros nativos, pero permite manejar números de cualquier tamaño.