Python en mathématiques - Défis

Rallye 2016 - Exercice 3

Carrément rare ?

Énoncé original

L’année 2016 est particulière :

  • le nombre formé par les deux derniers chiffres est le carré d’un entier ($16 = 4^2$),
  • la somme de ses chiffres est le carré d’un entier ($2 + 0 + 1 + 6 = 9 = 3^2$),
  • et si on ajoute le nombre formé des deux premiers chiffres et le nombre formé des deux derniers chiffres, on obtient encore le carré d’un nombre entier ($20 + 16 = 36 = 6^2$).

Quelle était la dernière année avant 2016 à avoir cette particularité ?

Question

Proposez un programme Python résolvant l'exercice.

  • Un code possible
  • Variante

Pour les calculs, on a utilisé la fonction racine carrée sqrt(). Cette fonction est incluse dans le module qui comporte les fonctions mathématiques usuelles et qui se nomme fort opportunément math.


from math import sqrt

def nombre_deux_derniers_chiffres(n):
    """ n est un entier naturel à quatre chiffres
    en écriture décimale."""
    return n%100
	
def nombre_deux_premiers_chiffres(n):
    """ n est un entier naturel à quatre chiffres
    en écriture décimale."""
    return n//100
	
def somme_des_chiffres(n):
    if n == 0 : return 0
    s = 0
    while n != 0:
        s += n%10
        n //= 10
    return s
	
def est_carre_parfait(n):
    return (int(sqrt(n)))**2 == n
	

 
def a_particularite_2016(n):
    if not(est_carre_parfait(nombre_deux_derniers_chiffres(n))):
        return False
    if not(est_carre_parfait(somme_des_chiffres(n))):
        return False
    if not(est_carre_parfait(nombre_deux_derniers_chiffres(n) + nombre_deux_premiers_chiffres(n))):
        return False
    return True
	
	
for n in range(1000, 2017):
    if a_particularite_2016(n):
        print(n)
	

On obtient :

1125
1609
2016

Variante sur la reconnaissance des carrés.



def est_carre_DeuxChiffres(n):
	return n in [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
	
def est_carre_parfait(n):
	""" renvoie True si n est un carre parfait inférieur à 2026, False sinon."""
	return n in [ j*j for j in range(0,46)]


	

def nombre_deux_derniers_chiffres(n):
    """ n est un entier naturel à quatre chiffres
    en écriture décimale."""
    return n%100

def nombre_deux_premiers_chiffres(n):
    """ n est un entier naturel à quatre chiffres
    en écriture décimale."""
    return n//100

def somme_des_chiffres(n):
    if n == 0 : return 0
    s = 0
    while n != 0:
        s += n%10
        n //= 10
    return s



def a_particularite_2016(n):
    if not(est_carre_DeuxChiffres(nombre_deux_derniers_chiffres(n))):
        return False
    if not(est_carre_parfait(somme_des_chiffres(n))):
        return False
    if not(est_carre_parfait(nombre_deux_derniers_chiffres(n) + nombre_deux_premiers_chiffres(n))):
        return False
    return True


for n in range(1000, 2017):
    if a_particularite_2016(n):
        print(n)
	

On obtient :

1125
1609
2016