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:
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.
Verificando el ejemplo
91 × 99 = 9009
Ambos son números de 2 dígitos (entre 10 y 99)
¿9009 es palíndromo?
Al revés: 9-0-0-9 → Sí!
¿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.
Conceptos clave
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.
Variante B: for con range
Bucles for anidados. Más compacto y pythónico.
Variante C: desde el mayor
Empezamos desde 999 hacia abajo. Encontramos palíndromos grandes primero (pero debemos seguir buscando).
¿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 |
Conceptos clave
str(n)
Conversión a string. Convierte el número 906609 en el texto "906609".
texto[::-1]
Slice inverso. El ::-1 recorre el string de atrás hacia adelante. "906609" → "906609".
range(999, 99, -1)
Range descendente. Empieza en 999, termina antes de 99, decrementando de 1 en 1.
and en condiciones
Operador lógico. Ambas condiciones deben ser verdaderas. Python evalúa de izquierda a derecha y para si encuentra False.
factores = (i, j)
Tupla. Agrupa dos valores relacionados. Accedemos con factores[0] y factores[1].
Conceptos de Python aprendidos
Generador + max
Usamos una expresión generadora para crear todos los palíndromos y max() para obtener el mayor.
Desglose
lambda n: str(n) == str(n)[::-1]
Función anónima en una línea. Equivale a def es_palindromo(n): return ...
for j in range(i, 1000)
j empieza en i, no en 100. Así evitamos calcular 100×999 y 999×100 (son iguales).
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) |
Conceptos aprendidos
Estructura de un palíndromo de 6 dígitos
Un palíndromo de 6 dígitos tiene la forma abccba.
Implicación
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).
Optimización
Podemos fijar uno de los factores como múltiplo de 11, reduciendo las iteraciones ~11×.
Comparativa de rendimiento
| Método | Iteraciones | Mejora |
|---|---|---|
| Fuerza bruta | 810.000 | — |
| Sin duplicados | 405.450 | 2× |
| Divisibilidad por 11 | ~36.855 | ~22× |