É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