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égatif
L'exécution donne :
>>>
abs2
(-
1
)
1
>>>
abs2
(
3.5
)
3.5
>>>
abs2
(
0
)
0
L'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
result
L'exécution donne :
>>>
fact
(
0
)
0
>>>
fact
(
3
)
6
>>>
fact
(
4
)
24
>>>
fact
(
5
)
120
fact(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)-
1
L'exécution donne :
>>>
E
(
3.14
)
3
>>>
E
(-
3.14
)
-
4
>>>
E
(
0
)
0
Il 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
resultat
L'exécution donne :
saisissez un nombre 15
*
16
**
2
+
16
*
13
+
9
0xFD9
Bien 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
b
L'exécution donne :
>>>
pgcd
(
120
,36
)
12
>>>
pgcd
(
2
,3
)
1
Si 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(
"
\n
Votre 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
"
\n
Saisissez 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
b
Le choix 2 :
# choix 2 : ppcm
elif
(
choix ==
'2'
) :
print
"
\n
Saisissez 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
True
Elle 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
result
Exemple :
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.5
On 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