VIII. Corrigés des exercices▲
VIII-A. Valeur absolue d'un nombre, sans utiliser la fonction intégrée abs() : Solution▲
# Fonction valeur absolue
def abs2(x) :
if x>=0 :
return x # résultat retourné lorsque x est positif
else :
return -x # résultat retourné lorsque x est négatifL'exécution donne :
>>> abs2(-1)
1
>>> abs2(3.5)
3.5
>>> abs2(0)
0L'exécution de abs2(x) avec x de type ni int, ni float produira une erreur…
VIII-B. Calcul de factorielle, sans utiliser le module math : Solution▲
# Fonction factorielle
def fact(x) :
x=int(x)
result = 1
while (x>1) :
result=result*x
x=x-1
return resultL'exécution donne :
>>> fact(0)
0
>>> fact(3)
6
>>> fact(4)
24
>>> fact(5)
120fact(x) avec x négatif ou de type non int produira un résultat absurde…
VIII-C. Partie entière d'un nombre, sans utiliser le module math : Solution▲
# Fonction partie entière E()
def E(x) :
if (x == int(x)) :
return x
elif (x>=0) :
return int(x)
else :
return -E(-x)-1L'exécution donne :
>>> E(3.14)
3
>>> E(-3.14)
-4
>>> E(0)
0Il est sans doute là aussi plus efficace d'utiliser la fonction floor() du module math.
VIII-D. Écriture d'un nombre en base 16 : Solution▲
a = input ('saisissez un nombre ')
resultat = ''
while a>0 :
b = a%16
if b < 10 : b = str(b)
elif b == 10 : b = 'A'
elif b == 11 : b = 'B'
elif b == 12 : b = 'C'
elif b == 13 : b = 'D'
elif b == 14 : b = 'E'
elif b == 15 : b = 'F'
resultat = b + resultat
a=a//16
resultat = '0x' + resultat
print resultatL'exécution donne :
saisissez un nombre 15*16**2+16*13+9
0xFD9Bien entendu, on réinvente la roue à titre d'exercice, et la fonction intégrée hex() fera le boulot de manière plus efficace.
VIII-E. PGCD : algorithme d'Euclide : Solution▲
Preuve : tout d'abord lorsque r = 0, a est un multiple de b et donc pgcd(a,b) = b. Lorsque r > 0. Puisque
kitxmlcodeinlinelatexdvp\exists q \in\mathbb{N},\ a = qb + rfinkitxmlcodeinlinelatexdvp,
tout diviseur de b et de r est aussi diviseur de a (ainsi que de b). De même r = a − qb et donc tout diviseur de a et de b est aussi diviseur de r (ainsi que de b). Ainsi a, b et b, r ont mêmes diviseurs communs ; en particulier : pgcd(a,b) = pgcd(b,r).
L'algorithme se termine : la valeur de b est un entier naturel qui diminue strictement à chaque itération de la boucle tandis que le reste r est un entier naturel strictement inférieur à b, ainsi il y aura au plus b passages dans la boucle avant que le critère d'arrêt r = 0 ne soit satisfait. D'après ce qui précède la valeur retournée est pgcd(a,b).
Solution :
# Algorithme d'Euclide pour le pgcd
def pgcd(a,b) :
while a%b != 0 :
a, b = b, a%b
return bL'exécution donne :
>>> pgcd(120,36)
12
>>> pgcd(2,3)
1Si au départ a < b la division euclidienne de a par b aura pour reste a (et quotient 0) et après la première itération de la boucle while les valeurs de a et b auront été échangées, il est donc inutile de traiter séparément le cas a<b.
VIII-F. Écriture d'un menu ▲
L'écriture du menu s'obtient par :
# Corps du programme
while True :
print """MENU :
1 - Calculer le PGCD de deux nombres
2 - Calculer le PPCM de deux nombres
3 - Déterminer si un nombre est premier
4 - Donner la décomposition en facteur premier d'un nombre
q - Quitter"""
choix = raw_input("\nVotre choix :")
# Quitter
if (choix == 'q' or choix =='Q') :
break
Une chaîne de caractères placée entre trois guillemets doubles """ """ permet d'inclure les sauts de ligne et les autres guillemets.
Le choix 1 appelle la fonction pgcd() déjà écrite lors de l'exercice précédent (elle doit figurer avant le corps du programme).
# choix 1 : pgcd
elif (choix == '1') :
print "\nSaisissez 2 entiers "
entier1 = input()
entier2 = input()
print "le pgcd de", entier1, "et", entier2, "est", pgcd(entier1,entier2)Fonction pgcd() :
# Algorithme d'Euclide pour le pgcd
def pgcd(a,b) :
while a%b != 0 :
a, b = b, a%b
return bLe choix 2 :
# choix 2 : ppcm
elif (choix == '2') :
print "\nSaisissez 2 entiers "
entier1 = input()
entier2 = input()
print "le ppcm de", entier1, "et", entier2, "est", ppcm(entier1,entier2)Fonction ppcm() :
def ppcm(a,b) :
return (a * b) / pgcd(a,b)à faire figurer avant le corps du programme. Elle utilise : a.b=pgcd(a, b).ppcm(a, b).
Les deux derniers choix appellent des fonctions premier() et pdecomp(), qu'il reste à écrire :
elif (choix == '3') :
entier = input("Saisissez un entier ")
if premier(entier) :
print entier, "est premier"
else :
print entier, "n'est pas premier"
elif (choix == '4') :
entier = input("Saisissez un entier ")
print "La décomposition de", entier, "en premiers est", pdecomp(entier)La fonction premier() prend en argument un entier et retourne un booléen selon si l'argument est un nombre premier ou pas. La fonction pdecomp() prend en argument un entier et retourne une chaîne de caractères donnant la décomposition en nombres premiers de l'argument.
La fonction premier() doit figurer avant le corps du programme :
from math import sqrt
def premier(a) :
result = True
n = 2
top = sqrt(a)
while (n <= top) :
if a % n== 0 :
return False
else :
n += 1
return TrueElle utilise la fonction sqrt() du module math qu'il s'agit d'importer auparavant.
La fonction pdecomp() doit figurer avant le corps du programme :
def pdecomp(a) :
result = ''
n = 2
anciena = a
premier = True
while (n <= a) :
if (a % n == 0) :
premier = False
if result == '' :
result = str(n)
else :
result = result + '.' + str(n)
a = a / n
else :
n = n + 1
if premier :
return str(anciena)
else :
return resultExemple :
MENU :
1 - Calculer le PGCD de deux nombres
2 - Calculer le PPCM de deux nombres
3 - Déterminer si un nombre est premier
4 - Donner la décomposition en facteur premier d'un nombre
q - Quitter
Votre choix :4
Saisissez un entier 120
La décomposition de 120 en premiers est 2.2.2.3.5On peut encore, pour améliorer le programme, gérer des exceptions lorsque l'utilisateur ne saisit pas un entier positif pour lui renvoyer un message d'erreur.
Le programme final (cliquez sur l'icône
pour dévoiler le code) :
MPSI1


