30 Exos Corrigés Avant La Séance 5
30 Exos Corrigés Avant La Séance 5
30 Exos Corrigés Avant La Séance 5
INFO
Chapitre 2
Exercice 2. HII
Soient a et b deux entiers naturels.
1. Écrire une boucle affichant et incrémentant (+1) la valeur de a tant qu’elle reste inférieure ou
égale à celle de b.
2. Écrire une boucle décrémentant (-1) la valeur de b, affichant sa valeur si elle est impaire, jusqu’à
ce que b soit nul.
15 + 25 + · · · + m5 .
Exercice 4. HII
Former la liste des nombres pairs entre −n et n, où n est un entier relatif donné.
1/5
j.verliat.free.fr
a←2
n←1
c←0
Boucle :√
c← 2+c
b ← 2/c
a ← ab
Fin Boucle dès que a est une valeur approchée à 10−3 près de π ou dès que
n > 500.
Exercice 10. HHI Algorithme de Brent-Salamin
En 1975, Richard Brent et Eugene Salamin ont élaboré l’algorithme suivant, qui permet d’obtenir une
suite qui converge rapidement vers π (cet algorithme a permis de réaliser plusieurs records de calcul
des décimales de π).
On pose a0 = 1, b0 = √1 , t0 = 14 , p0 = 1 puis, pour tout n ∈ N,
2
an + bn p
an+1 = , bn+1 = an bn , tn+1 = tn − pn (an − an+1 )2 et pn+1 = 2pn .
2
(an +bn )2
Lorsque an et bn sont « proches », la valeur de 4tn est une valeur approchée de π.
Implémenter cet algorithme en langage Python tant que |an − bn | > 10−10 .
Indication : l’instruction abs(a) renvoie la valeur absolue de a ; après avoir écrit import math, on
peut calculer la racine carrée d’un réel positif ou nul a grâce à l’instruction math.sqrt(a).
2/5
Exercices corrigés
Solutions
Solution de l’ex 1. Voici une proposition :
if A%4==0 and A%100!=0:
print(”l’année”,A,”est bissextile”)
elif A%400==0:
print(”l’année”,A,”est bissextile”)
else:
print(”l’année”,A,”n’est pas bissextile”)
Solution de l’ex 2. 1. Une boucle affichant et incrémentant (+1) la valeur de a tant qu’elle reste
inférieure ou égale à celle de b :
while a<=b:
print(a)
a+=1
2. Une boucle décrémentant (-1) la valeur de b, affichant sa valeur si elle est impaire, jusqu’à ce
que b soit nul :
while b>=0:
if b%2==1:
print(b)
b-=1
Solution de l’ex 4. On imagine facilement le cas où n est positif ou nul ; on s’y ramène en posant n=-n
dans le cas où n est strictement négatif (on aurait également pu utiliser la fonction abs prédéfinie
dans Python, qui renvoie la valeur absolue d’un réel). On propose alors une première version avec la
boucle for :
if n<0:
n=-n
L=[] # Initialisation de la liste
for k in range(-n,n+1):
if k%2==0:
L+=[k] # Ajout de k dans L si k est pair
que l’on peut réécrire de manière raccourcie avec l’écriture en compréhension d’une liste :
if n<0:
n=-n
L=[k for k in range(-n,n+1) if k%2==0]
3/5
j.verliat.free.fr
m=0
while n%2**m==0:
m+=1
print(m-1)
Solution de l’ex 7. Du conditionnement, en veux-tu ? En voilà !
num=12 # Un exemple...
if num==1:
print("Ain")
elif num==3:
print("Allier")
elif num==7:
print("Ardèche")
elif num==15:
print("Cantal")
elif num==26:
print("Drôme")
elif num==38:
print("Isère")
elif num==42:
print("Loire")
elif num==43:
print("Haute-Loire")
elif num==69:
print("Rhône")
elif num==73:
print("Savoie")
elif num==74:
print("Haute-Savoie")
else:
print("Ce numéro n’est pas un numéro d’un département de la région
Auvergne-Rhône-Alpes")
Solution de l’ex 8. On construit les deux algorithmes sur le même modèle :
S=0 P=1
for elem in L: for elem in L:
S+=elem P*=elem
4/5
Exercices corrigés
import math
a,b,t,p=1,1/math.sqrt(2),1/4,1
cpt=1
while abs(a-b)>10**(-10):
aa=(a+b)/2
a,b,t,p=aa,math.sqrt(a*b),t-p*(a-aa)**2,2*p
cpt+=1
print(cpt,((a+b)**2)/(4*t))
5/5
Exercices corrigés
INFO
Chapitre 3
relles.
3. Écrire une fonction qui renvoie le nombre an pour un flottant a et un entier naturel n donné.
4. Écrire une fonction Newton1 qui, étant donnés deux flottants a et b et un entier naturel n,
n
n k n−k
P
renvoie le nombre k a b .
k=0
5. Écrire une fonction Newton2 qui renvoie (a + b)n .
6. Écrire un script qui vérifie que les deux fonctions précédentes sont égales pour trois variables
d’entrée données.
7. Faire afficher le triangle de Pascal jusqu’à une ligne donnée.
S’il existe un entier n tel que un = 1, alors la suite est périodique à partir de ce n (1421421421...).
La conjecture, dite de Syracuse, prétend que, pour n’importe quelle valeur de a, il existe un entier N
tel que uN = 1.
1/8
j.verliat.free.fr
1. Écrire une fonction syracuse qui, étant donné un entier a, renvoie l’entier a/2 si a est pair, et
l’entier 3a+1 sinon.
2. Écrire une fonction test_syracuse qui teste la conjecture de Syracuse pour un entier naturel
donné.
3. Améliorer le dernier algorithme de manière à obtenir la valeur minimale de N telle que uN = 1
(si elle existe...) pour une valeur de a donnée.
Exercice 7. III Liste des diviseurs positifs d’un entier naturel
Écrire une fonction qui, étant donné un entier naturel n, renvoie la liste de ses diviseurs positifs.
Exercice 8. HHH A Liste des sous-listes d’une liste
Écrire une fonction qui, étant donné une liste d’objets, renvoie la liste de toutes ses sous-listes.
Par exemple, appliquée à [0, 2, 1], cette fonction renverra [[ ], [0], [2], [1], [0, 2], [2, 1], [0, 2, 1]].
Exercice 9. III ¤
Que fait cette fonction ?
def mystere(a,b):
a=a+b
b=a-b
a=a-b
return a,b
Exercice 10. HHI
Que fait cette fonction ?
def mystere(a,b):
if a>=b>=0 or a<=b<=0:
while abs(a)>=abs(b):
a=a-b
else:
while a*b<0:
a=a+b
return a
Exercice 11. HII ¤
Que fait cette fonction ?
def mystere(L):
M=[]
n=len(L)
for k in range(n-1,-1,-1):
M=M+[L[k]]
return M
Exercice 12. III ® Affichage de lettres en séquence
Écrire une fonction qui affiche, dans l’ordre et les unes au-dessous des autres, les lettres d’une chaîne
de caractères donnée.
Exercice 13. HII ¤ Nombre de voyelles
Écrire une fonction nombre_voyelles qui renvoie le nombre de voyelles d’une chaîne de caractères
donnée.
Exercice 14. HII Affichage d’un triangle d’étoiles
Que fait l’instruction 3*’bla’ ?
En déduire une fonction qui affiche n lignes analogues aux quatre suivantes :
2/8
Exercices corrigés
*
**
***
****
Écrire une fonction qui renvoie la liste des valeurs de uk pour k entre 0 et un entier naturel donné n.
3/8
j.verliat.free.fr
Solutions
Solution de l’ex 1. 1. Voici la simplissime fonction cube :
def cube(x):
return x**3
2. On utilise la fonction cube pour définir la fonction suivante :
import math
def volume_sphere(r):
return 4*math.pi*cube(r)/3
Solution de l’ex 3. On reprend les deux algorithmes écrits dans le chapitre précédent :
Solution de l’ex 4. 1. On calque une solution à cette question sur l’exercice précédent :
def somme_entiers(n):
S=0
for k in range(1,n+1):
S+=k
return S
2. Simplement, on propose :
def somme_entiers2(n):
return n*(n+1)/2
3. On propose l’idée suivante : on initialise un booléen (test) à True ; ensuite, on effectue les 100
tests concernés et dès qu’un test se révèle faux, on affecte à test la valeur False (dans ce cas,
on rajoute l’instruction break : son effet est d’arrêter la boucle for). À la fin de ce procédé, il
y a deux possibilités : soit l’un (au moins) des tests s’est avéré faux, auquel cas test contient
la valeur False ; soit tous les tests étaient vrais, et alors test n’a pas été modifié et contient
donc la valeur True.
test=True
for k in range(100):
if somme_entiers(k)!=somme_entiers2(k):
test=False
break # facultatif ; plus « efficace »
print(test)
4/8
Exercices corrigés
def factorielle(n):
f=1
for k in range(1,n+1):
f*=k
return f
2. Voici
une proposition de fonction, construite à partir de la fonction précédente. On sait que
n
k est un entier naturel, dès que k et n le sont ; de plus on sait que le calcul sur les entiers
en Python est axact, alors que le calcul sur les flottants est approché. En conséquence, on
utilise l’instruction // au lieu de / pour effectuer la division apparaissant dans la définition du
coefficient binomial.
def coeff_binome(n,k):
if 0<=k<=n:
return factorielle(n)//(factorielle(k)*factorielle(n-k))
else:
return 0
3. Voici la fonction puissance :
def puissance(a,n):
if n==0:
return 1
else:
p=1
for k in range(n):
p*=a
return p
4. Voici enfin la fonction Newton1 :
def Newton1(a,b,n):
S=0
for k in range(n+1):
S+=coeff_binome(n,k)*puissance(a,k)*puissance(b,n-k)
return S
5. Voici la fonction Newton2 :
def Newton2(a,b,n):
return puissance(a+b,n)
6. Voici un script pour tester l’égalité des deux fonctions précédentes, en attribuant à a, b et n
deux valeurs arbitraires :
a,b,n=2,3,5
if Newton1(a,b,n)==Newton2(a,b,n):
print("les deux fonctions retournent le même résultat")
else:
print("les deux fonctions ne retournent pas le même résultat")
7. Affichage du triangle de Pascal, les lignes au dessous des autres, affichées sous forme de lignes :
N=5
for n in range(N+1):
L=[]
for k in range(n+1):
L+=[coeff_binome(n,k)]
print(L)
5/8
j.verliat.free.fr
def syracuse(a):
if a%2==0:
return a//2
else:
return 3*a+1
2.3. Voici la version directement modifiée :
def test_syracuse(n):
N=0
while n!=1:
n=syracuse(n)
N+=1
return N
Solution de l’ex 8. Voici une solution bien décortiquée, mais sans commentaire et donc illisible :
6/8
Exercices corrigés
def suivant(L,n):
der=-1
m=n
while L[der]==m-1:
der-=1
m-=1
L[der]+=1
if L[0]==n-len(L):
return L,False
else:
return L,True
def conversion(L,Lp):
M=[]
for place in Lp:
M+=[L[place]]
return M
def sous_listes_taille(L,k):
Lp=list(range(k))
SLk=[conversion(L,Lp)]
test=True
while test:
Lp,test=suivant(Lp,len(L))
SLk+=[conversion(L,Lp)]
return SLk
def sous_listes(L):
SL=[[]]
for k in range(1,len(L)):
SL+=[sous_listes_taille(L,k)]
return SL+[L]
Solution de l’ex 9. Cette fonction s’applique à deux flottants a et b et renvoie le couple (b,a).
Solution de l’ex 10. Cette fonction s’applique à deux entiers a et b et renvoie a%b.
Solution de l’ex 11. Cette fonction renvoie la liste « miroir » d’une liste donnée (c’est-à-dire la liste
elle-même, mais dont les éléments ont été écrits dans l’ordre inverse).
7/8
j.verliat.free.fr
Solution de l’ex 19. On gère la relation de récurrence en utilisant deux variables que l’on fait évoluer
en même temps. On stocke le tout dans une liste.
def suite_rec_double(n):
u,v=1,1
L=[u,v]
for k in range(n-1):
u,v=v,v+2*u/(k+2)
L+=[v]
return L
C’est en fait plus simple de gérer la relation de récurrence en cherchant les termes un+1 et un dans la
suite des termes de u :
def suite_rec_double2(n):
L=[1,1]
for k in range(n-1):
L+=[L[-1]+2*L[-2]/(k+2)]
return L
Solution de l’ex 20. La première difficulté de cet exercice est de traduire l’énoncé
√ : le nombre cherché
∗
√ s’écrire comme le terme général de la suite récurrente définie par u1 = 2 et ∀n ∈ N , un+1 =
peut
2 + un . La seconde difficulté est de traiter le cas où n = 0 à part : dans ce cas, le nombre vaut 2...
import math # bibliothèque contenant la fonction racine carrée
n=2 # valeur de l’entier n pour tester
if n==0: # le cas où n vaut 0 est très particulier...
u=2
else: # les autres cas
u=math.sqrt(2) # initialisation de la valeur de u (u1 )
for k in range(2,n+1): # calcul de un avec n > 2
u=math.sqrt(2+u)
print(u)
8/8