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
(
"
\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
b
Le 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
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