Palíndromo más grande

Cargando Python...

Un palíndromo se lee igual de izquierda a derecha que de derecha a izquierda.

El palíndromo más grande hecho del producto de dos números de 2 dígitos es:

91 × 99 = 9009

Encuentra el palíndromo más grande hecho del producto de dos números de 3 dígitos.

¿Qué es un palíndromo?

Un número (o palabra) que se lee igual en ambos sentidos: 121, 1331, 9009.

9 0 0 9

Verificando el ejemplo

1

91 × 99 = 9009

Ambos son números de 2 dígitos (entre 10 y 99)

2

¿9009 es palíndromo?

Al revés: 9-0-0-9 → Sí!

3

¿Es el mayor?

99 × 99 = 9801 (no es palíndromo). No hay productos mayores que sean palíndromos.

El problema real

Con 3 dígitos (100-999), hay 900 × 900 = 810.000 productos posibles. Necesitamos un algoritmo para encontrar el mayor palíndromo.

str(n) == str(n)[::-1]
En Python: comparar el string con su reverso

Conceptos clave

🔤 Strings 🔄 Reverso 🔁 Bucles anidados 📊 Máximo

La estrategia

Probar todos los productos de dos números de 3 dígitos, verificar si cada producto es palíndromo, y quedarnos con el mayor.

Clave: Para verificar si un número es palíndromo, lo convertimos a string y comparamos con su reverso.

Variante A: while con contadores

Dos bucles while anidados con contadores manuales. Muy explícita, muestra cada paso.

Python
Pulsa "Ejecutar" para ver el resultado

Variante B: for con range

Bucles for anidados. Más compacto y pythónico.

Python
Pulsa "Ejecutar" para ver el resultado

Variante C: desde el mayor

Empezamos desde 999 hacia abajo. Encontramos palíndromos grandes primero (pero debemos seguir buscando).

Python
Pulsa "Ejecutar" para ver el resultado

¿Cuál elegir?

Variante Iteraciones Ventaja
A: while 810.000 Muy explícita
B: for range 810.000 Compacta
C: descendente ~menos Early exit con break
Resultado (las tres variantes) 906609

Conceptos clave

1

str(n)

Conversión a string. Convierte el número 906609 en el texto "906609".

2

texto[::-1]

Slice inverso. El ::-1 recorre el string de atrás hacia adelante. "906609" → "906609".

3

range(999, 99, -1)

Range descendente. Empieza en 999, termina antes de 99, decrementando de 1 en 1.

4

and en condiciones

Operador lógico. Ambas condiciones deben ser verdaderas. Python evalúa de izquierda a derecha y para si encuentra False.

5

factores = (i, j)

Tupla. Agrupa dos valores relacionados. Accedemos con factores[0] y factores[1].

Conceptos de Python aprendidos

🔤 str() 🔀 [::-1] slice inverso 🔁 for anidados 📦 Tuplas ⬇️ range descendente

Generador + max

Usamos una expresión generadora para crear todos los palíndromos y max() para obtener el mayor.

Python
Pulsa "Ejecutar" para ver el resultado

Desglose

1

lambda n: str(n) == str(n)[::-1]

Función anónima en una línea. Equivale a def es_palindromo(n): return ...

2

for j in range(i, 1000)

j empieza en i, no en 100. Así evitamos calcular 100×999 y 999×100 (son iguales).

3

max(...)

Recibe un generador y devuelve el valor máximo sin crear una lista en memoria.

Aspecto Fuerza bruta Pythónico
Iteraciones 810.000 405.450 (sin duplicados)
Líneas ~12 7
Memoria O(1) O(1) (generador)
Resultado 906609

Conceptos aprendidos

λ lambda 🌊 Generator expression 📊 max() 🔄 Evitar duplicados

Estructura de un palíndromo de 6 dígitos

Un palíndromo de 6 dígitos tiene la forma abccba.

a b c c b a
abccba = 100001a + 10010b + 1100c
Descomposición por posición
= 11 × (9091a + 910b + 100c)
¡Todo palíndromo de 6 dígitos es divisible por 11!

Implicación

1

Si P = i × j y P es divisible por 11

Entonces al menos uno de i o j debe ser divisible por 11 (11 es primo).

2

Optimización

Podemos fijar uno de los factores como múltiplo de 11, reduciendo las iteraciones ~11×.

Python
Pulsa "Ejecutar" para ver el resultado

Comparativa de rendimiento

Método Iteraciones Mejora
Fuerza bruta 810.000
Sin duplicados 405.450
Divisibilidad por 11 ~36.855 ~22×
Fuerza bruta 810.000 iteraciones
Optimizado (÷11) ~36.855 iteraciones
Resultado 906609
Factores 913 × 993

Conceptos aprendidos

🔢 Divisibilidad por 11 📐 Estructura numérica ⚡ Reducción de búsqueda 🧮 Propiedades de primos

Prueba con otro número de dígitos

dígitos