← Euler Lab
#016

Suma de Dígitos de una Potencia

Cargando Python...

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?

BigInt Manipulación de dígitos Potencias

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:

2¹ = 2
2² = 4
2³ = 8
2⁴ = 16
2⁵ = 32
2¹⁰ = 1,024
2²⁰ = 1,048,576
2³⁰ ≈ 1 billón
2⁶⁴ ≈ 1.8×10¹⁹
2¹⁰⁰⁰ = ???

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

215 = 32768
Suma = 3 + 2 + 7 + 6 + 8 = 26

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¹⁸.

C / C++
long long máximo: 2⁶³
2¹⁰⁰⁰ → overflow
Java
long máximo: 2⁶³
Necesita BigInteger
JavaScript
Number: solo 53 bits precisos
Necesita BigInt
Python
Enteros de precisión arbitraria
2**1000 funciona directamente

El Algoritmo

  1. Calcular 2¹⁰⁰⁰ (Python lo hace automáticamente con precisión infinita)
  2. Convertir el número a string para acceder a cada dígito
  3. Sumar los dígitos (convertidos de vuelta a int)
Suma de dígitos de 2¹⁰⁰⁰
1366
Dígitos en 2¹⁰⁰⁰
302

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.

Python — Solución directa
// Output aparecerá aquí

Desglose del Generator Expression

sum(int(d) for d in str(2**1000))

1.
2**1000 → calcula la potencia (Python BigInt)
2.
str(...) → convierte a string "107150860..."
3.
for d in ... → itera sobre cada carácter: "1", "0", "7", ...
4.
int(d) → convierte cada carácter a entero: 1, 0, 7, ...
5.
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.

Python — Con bucle explícito
// Output aparecerá aquí
Python — Sin convertir a string (matemático)
// Output aparecerá aquí

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.

Enteros de precisión arbitraria Generator expressions Extracción de dígitos (str vs %10)