Aller au contenu

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) si n 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