3#
29/05/22
On continue avec le projet Euler. Le probleme 4 nous parle de palindromes :
Ennoncé
A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is \(9009 = 91 \times 99\).
Find the largest palindrome made from the product of two 3-digit numbers.
Tres rapidement, un palindrome est un mot ou un nombre, se lisant aussi bien de gauche a droite, que de droite a gauche. Comme par exemple "kayak" ou \(1230321\).
Comme je ne connais pas de formule mathematique pour determiner si un nombre est un palindrome ou non, je vais utiliser un programme qui va le faire.
Determiner un palindrome#
Dans un premier temps on doit verifier si un nombre est un palindrome, voici mon code :
def is_pal(n):
return str(n) == str(n)[::-1]
Oui. C'est tout.
Explications
Pour ceux qui ne connaissent pas Python, je vais expliquer rapidement comment cette ligne de code est capable de determiner si un nombre est un palindrome.
str(n)
permet de convertir un nombre en une chaine de caracteres (str(123) == "123"
)[::-1]
permet de renverser l'ordre de la chaine de caracteres ("abcd"[::-1] == "dcba"
)- La fonction retourne soit vrai (
True
) sin
est un palindrome, soit faux (False
)
Produits de nombres#
Maintenant, il nous faut calculer tous les produits possibles de nombres a 3 chiffres :
def facto():
for x in range(100, 999): # Tous les entiers entre 100 et 999
for y in range(100, 999): # Comme au dessus
prod = x * y # Le produit des deux
Solution#
Nous avons maintenant tous les blocs du probleme resolus, il nous faut simplement les mettre bout a bout.
# Teste si n est un palindrome
def is_pal(n):
return str(n) == str(n)[::-1]
# Liste tous les palindromes qui sont des produits de nombres a 3 chiffres
def facto():
pals = list() # Liste des palindromes
for x in range(100, 999):
for y in range(100, 999):
prod = x * y
if is_pal(prod): # Si le produit est un palindrome
pals.append(prod) # On l'ajoute a notre liste
return pals
# Tri des palindromes par ordre decroissant,
# pour avoir le plus grand en premiere position
pals = sorted(facto(), reverse=True)
print(pals[0]) # Affiche le plus grand palindrome de la liste
# 906609