Exercices de Programmation Python
Exercices de Programmation Python
Série 1
Exercices
Exercice 1
Ecrire un programme qui permet de saisir un nombre puis déterminer s’il appartient à un intervalle
donné, sachant que les extrémités de l’intervalle sont fixées par l’utilisateur.
• Corrigé
Exercice 2
Ecrire un programme qui demande deux nombres à l’utilisateur et l’informe ensuite si leur produit
est négatif ou positif. Attention toutefois : on ne doit pas calculer le produit des deux nombres.
• Corrigé
Exercice 3
Ecrire un programme qui permet de calculer le montant des heures supplémentaires d’un employé,
sachant le prix unitaire d’une heure selon le barème suivant :
▪ Les 39 premières heures sans supplément,
▪ De la 40ième à la 44ième heure sont majorées de 50%,
▪ De la 45ième à la 49ième heure sont majorées de 75%,
▪ De la 50ième heure ou plus, sont majorées de 100%.
CPGE_MPSI 1
/PCSI
Algorithmique et programmation Langage python
• Corrigé
Exercice 4
Ecrivez un programme qui lira au clavier l’heure et les minutes, et il affichera l’heure qu’il sera une
minute plus tard. Par exemple, si l'utilisateur tape 21 puis 32, l'algorithme doit répondre : "Dans une
minute, il sera 21 heure(s) 33". NB : on suppose que l'utilisateur entre une heure valide. Pas besoin
donc de la vérifier.
• Corrigé
CPGE_MPSI 2
/PCSI
Algorithmique et programmation Langage python
Exercice 5
Écrire un programme qui à partir d’une note affiche la mention correspondant ?
• Corrigé
Exercice 6
Ecrire un programme qui demande un nombre de départ, et qui ensuite affiche les dix nombres
suivants. Par exemple, si l'utilisateur entre le nombre 17, le programme affichera les nombres de
18 à 27.
• Corrigé
Exercice 7
Le pgcd de deux nombres par soustractions successives.
• pgcd (a, b) = pgcd (a − b, a) si a > b
• pgcd (a, b) = pgcd (a, b − a) si b > a
□ pgcd (a, b) = a si a = b
On suppose que les opérandes sont des entiers positifs, écrire un programme qui permet de calculer
le PGCD de deux nombres a et b.
CPGE_MPSI 3
/PCSI
Algorithmique et programmation Langage python
• Corrigé
Exercice 8
Écrire un programme qui saisie N entiers et affiche leur somme et leur moyenne ?
• Corrigé
Exercice 9
Ecrire un programme qui détermine si un entier N est parfait ou non. Un entier est dit parfait s'il est
égal à la somme de ses diviseurs. Exemple 6 = 3 + 2 +1
• Corrigé
CPGE_MPSI 4
/PCSI
Algorithmique et programmation Langage python
Exercice 10
Ecrire un programme qui permet de calculer le produit de deux entiers en utilisant des additions
successives.
• Corrigé
Exercice 11
Ecrire un programme qui permet de saisir un entier N et d'afficher s'il est premier ou non. Un nombre
est dit premier s'il est divisible uniquement par 1 et par lui-même.
• Corrigé
Exercice 12
Ecrire programme permettant de lire un nombre entier N puis calcule son factoriel.
N !=1*2*3*….*(n-1)*N
0 !=1
a) Utilisez While,
b) Utilisez For.
CPGE_MPSI 5
/PCSI
Algorithmique et programmation Langage python
• Corrigé
Exercice 13
Calculer la moyenne de notes fournies au clavier avec un dialogue de ce type :
note 1 : 12
note 2 : 15.25
note 3 : 13.5
note 4 : 8.75
note 5 : -1
moyenne de ces 4 notes : 12.37
Le nombre de notes n’est pas connu a priori et l’utilisateur peut en fournir autant qu’il le désire. Pour
signaler qu’il a terminé, on convient qu’il fournira une note fictive négative.
• Corrigé
6
CPGE_MPSI/PCSI
Algorithmique et programmation Langage python
Série 2
Exercices
Exercices 1
Ecrire un programme qui demande à l’utilisateur un nombre compris entre 1 et 3 jusqu’à ce que la
réponse convienne.
• Corrigé
Exercice 2
Ecrire un programme qui demande un nombre compris entre 10 et 20, jusqu’à ce que la réponse
convienne. En cas de réponse supérieure à 20, on fera apparaître un message : « Plus petit ! », et
inversement, « Plus grand ! » si le nombre est inférieur à 10.
• Corrigé
7
Algorithmique et programmation Langage python
Exercice 3
Ecrire un programme qui permet de saisir une série de nombres entiers positifs et qui après saisie,
affiche les valeurs du plus petit et du plus grand nombre saisi ainsi que la somme et la moyenne
des nombres.
• Corrigé
Exercice 4
Écrire un programme qui permet de calculer S1, S2, S3, S4, S5 et S6 tel que:
1. S1 = 1 + ½ + 1/3 + ¼ +……..1/N
2. S2 = 1 + ½ + ¼ + 1/6 +……..1/N
3. S3 = 1 + 1/3 + 1/5 +……..1/N
4. S4 = 1 - ½ + ¼ - 1/6……..1/N
5. S5 = 1 + x+x²……..xN
6. S6 = 1 + x+x²/2…….. xN /N
Le nombre N est fixé par l’utilisateur
Algorithmique et programmation Langage python
• Corrigé
N=int(input(‘Saisir N ‘))
S1, S2, S3, S4, S5, S6=1,1,1,1,1,1
for i in range(2,N+1) :
S1+=1/i
print(‘la somme S1 est ’,S1)
for i in range(2,N+1,2) :
S2+=1/i
print(‘la somme S1 est ’,S2)
for i in range(3,N+1,2) :
S3+=1/i
print(‘la somme S1 est ’,S3)
signe=-1
for i in range(2,N+1,2) :
S1+=signe*(1/i)
signe*=(-1)
print(‘la somme S4 est ’,S4)
x=int(input(‘saisir x ‘))
for i in range(1,N+1) :
S5+=x**i
print(‘la somme S5 est ’,S5)
for i in range(1,N+1) :
S6+=(x**i)/i
print(‘la somme S6 est ’,S6)
CPGE_MPSI
/PCSI
Algorithmique et programmation Langage python
Exercice 5
Ecrire un programme qui détermine le 20ième terme d'une suite définie par
: S0 = 2, S1 = 3 et Sn = Sn-2 + (-1)n * Sn-1
• Corrigé
Exercice 6
Ecrire un programme qui détermine le Nième terme d'une suite définie par
: S0 = 2, S1 = 3, S2 = -2 et Sn = Sn-3 + (-1)n * Sn-1
• Corrigé
Exercice 7
Ecrire un programme qui à partir d’une date divisée en ses composantes (J, M, A) et affiche la date
du lendemain.
Tenir compte du cas où la date saisie est la date du dernier jour du mois ou celle du dernier jour de
l’année.
Remarque : prendre 28 comme nombre de jours du mois de février.
CPGE_MPSI
/PCSI
Algorithmique et programmation Langage python
• Corrigé
A=int(input(“saisir une année : “))
M=int(input(“saisir le mois : “))
J=int(input(“saisir le jour : “))
if M>12 or J>31 :
print(“la date est invalide“)
else :
if M==12 :
if j<31 :
J+=1
else :
J=0
M=1
A+=1
elif M==2 :
if J>28 :
print(“jour invalide“)
elif J==28 :
J=0
M+=1
else :
J+=1
else :
if M==1 or M==3 or M==5 or M== 7 or M==8 or M==10:
if J==31 :
J=0
M+=1
else :
J+=1
else :
if J==30 :
J=0
M+=1
else :
J+=1
CPGE_MPSI
/PCSI
Algorithmique et programmation Langage python
Pour calculer les moyens de ses étudiants, un professeur calcule deux moyennes : la moyenne
arithmétique et la moyenne de la mauvaise et la meilleure des notes de trois notes. Il choisira par
la suite la meilleure des deux moyennes calculées. Ecrire un programme qui saisit les trois notes
d’un étudiant et affiche la moyenne finale accordée.
▪ Exemple :
Si les trois notes d’un étudiant sont : 12, 8, 14 alors :
Moyenne arithmétique=(12+8+14)/3=34/3=11,34
Moyenne de la mauvaise et de la meilleure : (14+8)/2=22/2=11
Le professeur choisira la première moyenne.
• Corrigé
CPGE_MPSI
/PCSI
Algorithmique et programmation Langage python
Ecrivez un programme qui lit trois valeurs entières (A, B et C) au clavier. Triez les valeurs A, B et C
par échanges successifs de manière à obtenir : val(A) val(B) val(C) et affichez les trois valeurs.
• Corrigé
CPGE_MPSI
/PCSI
Algorithmique et programmation Langage python
Les fonctions et
récursivité
Exercice 1
On se propose de calculer une valeur approchée de la constante K de Catalan en utilisant la formule
suivante :
Ecrire une fonction val_app(epsilon) qui permet de retourner une valeur approchée de la constante
K en utilisant la formule ci-dessus et en s’arrêtant dès que la valeur absolue de la différence entre
deux somme successives devienne inférieure ou égale à une erreur epsilon donnée en paramètre.
• Corrigé
Exercice 2
Soit la formule suivante qui permet de déterminer une valeur approchée de Cos(x) :
CPGE_MPSI
/PCSI
Algorithmique et programmation Langage python
Exercice 3
Soit la suite U définie par :
-U0 est un entier positif pris au hasard (avec 3<U0<40
-Un=Un-1/2 si Un-1 est pair, sinon Un=3*Un-1+1 (n>0)
cette suite aboutit au cycle redondant formé par les trois termes 4,2,1 à partir d’un certain rang.
▪ Exemple :
Pour U0=3
U1=10 U2=5 U3=16 U4=8 U5=4 U6=2 U7=1 U8=4 U9=2 U10=1,
Donc la suite U entre dans le cycle redondant 4,2,1 à partir du 6ème terme(rang=6)
Ecrire une fonction Python permettant de déterminer le rang à partir duquel la suite U aboutit au
cycle redondant 4, 2 et 1
CPGE_MPSI
/PCSI
Algorithmique et programmation Langage python
Exercice 4
Ecrivez un programme Python permettant de calculer la limite à près de la suite définie par la
relation de récurrence :
U0 =2 et Un+1= Un +2/Un , n0.
On arrête d’itérer quand l’intervalle entre 2 termes consécutifs devient strictement inférieur à .
• Corrigé
CPGE_MPSI
/PCSI
Algorithmique et programmation Langage python
Exercice 5
Ecrivez un programme Python permettant de calculer la nième terme de la suite définie par :
□ F0=1, F1=2
• Fn= 4Fn-1 + 3Fn-2 (n 2 )
• Corrigé
Exercice 6
La suite de Fibonacci est définie comme suit :
1 𝑠𝑠𝑠𝑠 𝑈 < 2
𝑈𝑈𝑈𝑈
𝑈𝑈9:! + 𝑈𝑈9:+ 𝑠𝑠𝑠𝑠𝑈𝑈𝑠𝑠𝑈𝑈
Ecrire une fonction récursive calculant Fib(n)
• Corrigé
def Fib(n) :
if n<2 :
return 1
else :
return Fib(n-1)+ Fib(n-2)
Exercice 7
Soit la suite définie par :
1 𝑠𝑠𝑠𝑠 𝑈𝑈 <
𝑈𝑈𝑈𝑈
2 3𝑈𝑈9:! + 𝑈𝑈9:+
𝑠𝑠𝑠𝑠𝑈𝑈𝑠𝑠𝑈𝑈
Ecrire une fonction récursive permettant de calculer le nième terme de la suite.
CPGE_MPSI
/PCSI
Algorithmique et programmation Langage python
• Corrigé
Exercice 8
Soient u et v les deux suites définies par :
Ecrire deux fonctions CalculerU (a,b,n) et CalculerV(a,b,n) pour calculer respectivement les deux
termes Un et Vn des deux suites.
• Corrigé
CPGE_MPSI
/PCSI
Algorithmique et programmation Langage python
Exercice 9
Considérons la méthode suivante pour calculer Xn :
• Corrigé
CPGE_MPSI
/PCSI
Algorithmique et programmation Langage python
Exercice 1 :
Un entier est dit distinct s’il est composé de chiffres distincts (différents).
Ecrire un programme python qui permet de saisir un entier n (n>0), puis de vérifier et d’afficher si
cet entier est distinct ou non.
Exemple :
N=1273 est dit distinct car il est formé par les chiffres 1, 2, 7 et 3 qui sont tous distincts, donc, le
programme affichera : cet entier est distinct
N=1565 est dit non distinct car il est formé par les chiffres 1, 5, 6, 5 qui ne sont pas tous distincts
(le chiffre 5 se répète deux fois, donc le programme affichera : cet entier est non distinct
• Corrigé
Exercice 2 :
Ecrire un programme python qui permet d’afficher tous les entiers positifs de trois chiffres de la
forme cdu tel que, pour chaque entier, la somme de ses chiffres (c+d+u) est un diviseur du produit
de ses chiffres (c*d*u)
Exemple :
L’entier 514 vérifie cette propriété, en effet, (5+1+4) =10 est un diviseur de (5*1*4) =20
• Corrigé
CPGE_MPSI
/PCSI
Algorithmique et programmation Langage python
Exercice 3 :
En arithmétique, un auto-nombre est un entier naturel N qui ne peut pas s’écrire sous la forme d’un
nombre M ajouté à la somme des chiffres de M.
▪ Exemple :
▪ Pour N=21, n’est pas un auto nombre, puisqu’il peut être généré à partir de la somme d’un nombre M égal à 15
et les chiffres qui le constituent (1 et 5) c’est-à-dire 21=15+1+5.
▪ Pour N=20, est un auto-nombre puisqu’il ne peut pas être généré à partir de la somme d’un nombre M et les
chiffres qui le constituent.
Ecrire un programme permettant de vérifier si un entier naturel N strictement positif est un auto-
nombre.
• Corrigé
Exercice 4 :
Ecrire un programme Python qui permet de déterminer si un entier N de quatre chiffres vérifie la
relation suivante :
N=somme des puissance Kème de ses chiffres, avec 1<=K<=5
▪ Exemple :
Pour voir si le nombre n=1634 vérifie ou non cette propriété on commence par calculer la somme
des chiffres à la puissance 1, puis à la puissance 2, puis à la puissance 3,… :
▪ 11+61+31+41=14 est différent de 1634 alors on continue avec les chiffres à la puissance 2
▪ 12+62+32+42=62 est différent de 1634 alors on continue avec les chiffres à la puissance 3
▪ 23+63+33+43=308 est différent de 1634 alors on continue avec les chiffres à la puissance 4
▪ 14+64+34+44=1634 est égal à 1634 alors on arrête le traitement et on affiche : n=1634 et K=4
Pour le nombre n=2114, voyons s’il vérifie ou pas la propriété :
CPGE_MPSI
/PCSI
Algorithmique et programmation Langage python
▪ 21+11+11+41=8 est différent de 2114 alors on continue avec les chiffres à la puissance 2
▪ 22+12+12+42=22 est différent de 2114 alors on continue avec les chiffres à la puissance 2
▪ 23+13+13+43=74 est différent de 2114 alors on continue avec les chiffres à la puissance 2
▪ 24+14+14+44=274 est différent de 2114 alors on continue avec les chiffres à la puissance 2
▪ 25+15+15+45=1058 est différent de 2114 alors on arrête le traitement et on affiche le message : n=2114 ne vérifie
pas la propriété
• Corrigé
Exercice 5 :
Un nombre premier N est dit circulaire s’il vérifie la propriété suivante : chacune des rotations de
ses chiffres d’un élément vers la droite, forme à son tour un nombre premier.
▪ Exemple :
Si N=719 est un nombre premier circulaire car 719, 971 et 197 sont des nombres premiers avec :
▪ 971 est le nombre obtenu après une rotation des chiffres de 719 d’un élément vers la droite.
▪ 197 est le nombre obtenu après une rotation des chiffres de 971 d’un élément vers la droite
Si N=23, N n’est pas un nombre premier circulaire car il est premier mais 32 ne l’est pas.
Si N=6102, N n’est pas un nombre premier circulaire car il n’est pas premier.
Ecrire un programme Python permettant de chercher tous les nombre premiers circulaire se trouvant
dans un intervalle [p,q] fournis par l’utilisateur.
CPGE_MPSI
/PCSI
Algorithmique et programmation Langage python
def premier(n):
if n==2 :
return True
etat=True
for i in range(2, int(sqrt(n))+2):
if n%i==0:
etat=False
break
return etat
def circulaire(p,q):
for i in range(p,q+1):
if premier(i)==True:
etat=True
ch=str(i)
k=0
while k<len(ch) and etat==True:
ch=ch[-1]+ch[:len(ch)-1]
if premier(int(ch))==False:
etat=False
break
k+=1
if etat==True:
print('nombre : ',i)
Exercice 6 :
On définit le poids d’une chaine comme étant la somme des produits de la position de chaque
voyelle dans cette chaine par son rang dans l’alphabet français.
Si la chaine ne contient pas de voyelles alors son poids est égal à zéro.
N.B : les voyelles sont A, E, I, O, U, Y et leurs rangs respectifs sont :1, 5, 9, 15, 21, 25
▪ Exemple :
La chaine ‘BONNE’ contient 2 voyelles ‘O’ et ‘E’, sont poids est égal à 2*15+5*5=55
La chaine ‘CHANCE’ contient 2 voyelles ‘A’ et ‘E’, son poids est égal à : 3*1+6*5=33
▪ Travail à faire :
Ecrire un programme Python qui permet de lire une chaine non vide, composée seulement par des
lettres alphabétiques majuscules puis calcule et affiche le poids de cette chaine.
CPGE_MPSI
/PCSI
Algorithmique et programmation Langage python
CPGE_MPSI
/PCSI
Algorithmique et programmation Langage python
Exercice 7
On se propose d’écrire un programme Python permettant de déterminer et d’afficher un code à partir
d’un entier N strictement positif et supérieur à 100, selon le principe suivant :
▪ Calculer la somme S des chiffres qui composent le nombre N
▪ Recommencer le calcul de la somme des chiffres de la somme obtenue S tant que celle-ci n’est pas comprise
entre 1 et 9.
Le code sera le nombre formé par N auquel on place à sa gauche la dernière somme obtenue.
▪ Exemple :
Pour N=9867, le programme affichera : le code est 39867
En effet :
Pour N=9867 :
▪ La 1ère somme S vaut 30 (car 9+8+6+7=30)
▪ La 2ème somme S vaut 3 (car 3+0=3)
▪ Etant donné que la derniers somme S, qui vaut 3, est comprise entre 1 et 9, le code sera 39867
• Corrigé
CPGE_MPSI
/PCSI
Algorithmique et programmation Langage python
• Corrigé
Exercice 2 :
On se propose d’écrire un programme qui permet de saisir et de crypter un mot M non vide,
composé uniquement par des lettres majuscules et d’afficher le mot crypté MC.
La méthode de cryptage est la suivante :
▪ Pour chaque lettre, déterminer son nombre d’occurrence (apparition) n dans le mot M.
▪ Déterminer K qui est égal à 2*n si n est impair et sera égal à (n DIV 2) si n est pair.
▪ Remplacer chaque lettre par Kième lettre qui la suit dans l’intervalle de l’alphabet [‘A’…’Z’].
▪ Pour les dernières lettres, on rend dès le début, par exemple si K=3, on remplacera ‘A’ par ‘D’,’B’ par ‘E’, ‘C’
par ‘E’… ‘Y’ par ‘B’ et ‘Z’ par ‘C’.
CPGE_MPSI
/PCSI
Algorithmique et programmation Langage python
▪ Exemple :
Pour le mot ‘HAPPY’
‘H’ ‘A’ ‘P’ ‘P’ ‘Y’
Nombre d’occurrence 1 1 2 2 1
La valeur de K 1*2=2 1*2=2 2 DIV 2=1 2 DIV 2=1 1*2+2
La lettre de
‘J’ ‘C’ ‘Q’ ‘Q’ ‘A’
remplacement
Le mot crypté sera :’JCQQA’
▪ Travail à faire :
Ecrire un programme Python qui permet de saisir un mot non vide et composé uniquement par des
lettres majuscules, puis d’afficher le mot crypté selon le principe décrit ci-dessus.
• Corrigé
Exercice 3 :
Un des plus anciens systèmes de cryptographie (aisément déchiffrable) consiste à décaler les
lettres d’un message pour le rendre illisible. Ainsi, les A deviennent des B, les B des C, etc.
Et les Z deviennent des A
Ü Exemple :
Si CH=’ABCCZABEY’ alors la chaine Res crypté qui sera affichée est ‘BCDDABCEZ’
Travail à faire :
CPGE_MPSI
/PCSI
Algorithmique et programmation Langage python
Ecrivez un programme qui demande une chaine CH à l’utilisateur et qui la code dans une chaine
Res selon ce principe.
• Corrigé
• Corrigé
Exercice 5 :
Une technique ultérieure de cryptographie consista à opérer non avec un décalage systématique,
mais par une substitution aléatoire. Pour cela, on utilise un alphabet-clé, dans lequel les lettres se
succèdent de manière désordonnée, par exemple :
HYLUJPVREAKBNDOFSQZCWMGITX
CPGE_MPSI
/PCSI
Algorithmique et programmation Langage python
C’est cette clé qui va servir ensuite à coder le message. Selon notre exemple, les A deviendront
des H, les B des Y, les C des L, etc.
Ü Exemple :
Si CH=’ABCDEFZ’ alors la chaine Res crypté qui sera affichée est ‘HYLUJPX’
Travail à faire :
Ecrire un programme Python qui effectue ce cryptage (l’alphabet-clé sera saisi par l’utilisateur, et
on suppose qu'il effectue une saisie correcte) sur une chaine de caractères CH et stocker le résultat
dans Res.
• Corrigé
• Corrigé
CPGE_MPSI
/PCSI
Algorithmique et programmation Langage python
CPGE_MPSI
/PCSI
Algorithmique et programmation Langage python
def NbcMin(passe):
nb=0
for i in passe:
if 'a'<=i<='z':
nb+=1
return nb
def NbcMaj(passe):
nb=0
for i in passe:
if 'A'<=i<='Z':
nb+=1
return nb
def NbcAlpha(passe):
return len(passe)-NbcMaj(passe)-NbcMin(passe)
def longMaj(passe):
d=0
s=0
i=0
while i< len(passe):
if 'A'<passe[i]<'Z':
s+=1
else:
if s > d:
d=s
s=0
i+=1
return d
def longMin(passe):
d=0
s=0
i=0
while i< len(passe):
if 'a'<passe[i]<'z':
Exercice 2 :
Louis Braille, est l’inventeur du système d’écriture tactile à points saillants, à l’usage des personnes aveugles
ou fortement malvoyantes.
En braille standard :
▪ Un caractère est représenté par six points numérotés de 1 à 6 et disposés comme le montre la Figure
1
▪ Un point peut être saillant (en relief) ou non, comme le montre la Figure 2.
▪ Le nombre et la disposition des points en relief définissent un caractère.
Figure 1 Figure 2
Dans la suite, on s’intéressera à la représentation des 26 lettre majuscules de l’alphabet français. Le tableau
suivant donne cette représentation.
**----*-*-*-*-***--*-**-*-*-*-*-*--****-*-
****---***---*-*--
Le programme affichera la chaine : ‘BONJOUR PSI’
En effet :
-‘BONJOUR’ est l’équivalent en alphabet français de la première ligne du fichier ‘[Link]’.
B O N J O U R
def coder(fichier) :
dic=dictionnaire('codes_Braille.txt')
f=open(fichier)
s=""
for j in f:
c=[Link]()
nb=len(j)//6
po=0
for k in range(nb):
cle=c[po:po+6]
s+=dic[cle]
po+=6
s+=' '
return s
print(coder('[Link]'))
c=[Link]()
l=[Link](' ')
cle=l[0]
dic[cle]=l[1]
[Link]()
return dic
def massAtome():
dic= dictionnaire('[Link]')
source=open('[Link]')
dest=open('[Link]','a')
for ligne in source:
c=[Link]()
l=[Link]('*')
atome=''
nb=''
estnombre=False
masse=0
for lettre in l[1]:
if 'A'<=lettre<='Z' or 'a'<=lettre<='z':
if estnombre==True:
masse+=int(dic[atome])*int(nb)
atome=''
nb=''
estnombre=False
atome+=lettre
else:
estnombre=True
nb+=lettre
masse+=int(dic[atome])*int(nb)
[Link](l[1]+':'+str(masse)+'\n')
massAtome()
Exercice 2 :
Dans un contexte arithmétique, on définit les nombres premiers factoriels et les nombres premiers primoriels
comme indiqué ci-après.
Un nombre PF est dit premier factoriel s’il vérifie les deux propriétés suivantes :
▪ PF est un nombre premier
▪ Et PF s’écrit sous la forme d’un factoriel incrémenté ou décrémenté de 1 (PF=F! + 1 ou PF=F! - 1),
sachant que le factoriel de F noté F ! est égal à F*(F-1) *…*1
Exemple :
▪ 7 est un nombre premier factoriel car 7 est premier et il s’écrit sous la forme 3! + 1.
▪ 719 est un nombre premier factoriel car 719 est premier et il s’écrit sous la forme 6! - 1.
Un nombre PP est dit premier primoriel s’il vérifie les deux propriétés suivantes :
▪ PP est un nombre premier
▪ PP s’écrit sous la forme d’une primorielle incrémentée ou décrémentée de 1 (PP=P#+1 ou PP=P#-1),
sachant que la primorielle de P notée P# est égale au produit des nombres premiers inférieurs ou égaux
à P.
Exemple
▪ 211 est un nombre premier primoriel car 211 est premier et il s’écrit sous la forme 7# + 1
En effet, 7#+1=2*3*5*7 + 1 =210 + 1=211
▪ 30029 est un nombre premier primoriel car 30029 est premier et il s’écrit sous la forme 13# - 1
En effet, 13# - 1 = 2*3*5*7*11*13-1=30030 – 1 =30029
Travail demandé :
1. Ecrire une fonction premier_fact(n) qui permet de vérifier est ce que n est un nombre premier factoriel
ou non
2. Ecrire une fonction premier_primoriel(n) qui permet de vérifier est ce que n est un nombre premier
primoriel ou non
Correction :
f=f*ordre
ordre+=1
if f+1==n or f-1==n:
etat=True
return etat
def premier_primoriel(n):
etat=False
if premier(n)==True:
p=3
s=0
while s<n:
s=1
for i in range(2,p+1):
if premier(i)==True:
s=s*i
p+=1
if s+1==n or s-1==n:
etat=True
break
return etat
n=719
print(premier_fact(n))
Correction :
def valide(ip):
ad=[Link]('.')
if len(ad)==4:
if 0<int(ad[0])<255 and 0<int(ad[1])<255 and 0<int(ad[2])<255 and 0<int(ad[3])<255:
return True
else: return False
else: return False
def binaire(nb):
val=['0','0','0','0','0','0','0','0']
binn=bin(int(nb))
i=len(val)-len(binn[2:])
for lettre in binn[2:]:
val[i]=lettre
i+=1
return ''.join(val)
def classe(ip):
if valide(ip):
ad=[Link]('.')
binn=binaire(ad[0])
if binn[0]=='0':
return 'A'
elif binn[:2]=='10':
return 'B'
elif binn[:3]=='110':
return 'C'
elif binn[:4]=='1110':
return 'D'
else:
return 'E'
else: return False
def adresseip6(ip):
if valide(ip):
ad=[Link]('.')
adresse=hex(int(ad[0]))[2:]+hex(int(ad[1]))[2:]+':'+hex(int(ad[2]))[2:]+hex(int(ad[3]))[2:]+'\n'
return adresse
else: return ''
def Genere():
source=open('F_IPV4.txt')
dest=open('F_IPV6.txt','a')
for ligne in source:
if valide([Link]()):
chaine=[Link]()+' : '+classe([Link]())+' : '+adresseip6([Link]())
[Link](chaine)
[Link]()
[Link]
Exercice 2 :
On se propose de crypter un message, formé uniquement par des lettres majuscules et des espaces, en utilisant
la méthode de chiffrement de Polybe qui consiste à :
▪ Ranger, dans une matrice carrée de dimension 5x5, les lettres d’un mot-clé donné suivies des lettres
restantes de l’alphabet dans l’ordre, à l’exception de la lettre ‘W’.
Le mot-clé est une chaine de caractères formée uniquement de L lettres majuscules, sans doublons et
ne contenant pas la lettre ‘W’ (avec 3<=L<=10).
▪ Remplacer chaque lettre du message à crypter par les coordonnées de sa position dans la matrice (le
numéro de la ligne suivi du numéro de la colonnes), sachant que :
➢ Le caractère espace ne subit aucun cryptage ;
➢ La lettre ‘W’ sera remplacée par les coordonnées de la lettre ‘V’
Exemple
Pour le mot-clé ‘MYSTER, on construit la matrice suivante :
1 2 3 4 5
1 M Y S T E
2 R A B C D
3 F G H I J
4 K L N O P
5 Q U V X Z
Correction :
def matrice(motcle):
alpha='ABCDEFGHIJKLMNOPQRSTUVXYZ'
Mat=[[0]*5 for _ in range(5)]
Mat[0][0]=motcle[0]
i=0
j=1
for pos in range(1,len(motcle)):
if j==5:
i+=1
j=0
if motcle[pos] not in motcle[:pos]:
Mat[i][j]=motcle[pos]
j+=1
for pos in range(len(alpha)):
if j==5:
i+=1
j=0
if alpha[pos] not in motcle:
Mat[i][j]=alpha[pos]
j+=1
return Mat
def Crypter_Polybe(msg, motcle):
Mat=matrice(motcle)
res=''
for pos in range(len(msg)):
if msg[pos]==' ':
res+='_'
elif msg[pos]=='W':
res+='00'
else:
i=0
j=0
while Mat[i][j]!=msg[pos]:
j+=1
if j==5:
j=0
i+=1
res+=str(i+1)+str(j+1)
return res
Exercice 1
Un nombre heureux est un nombre entier qui, lorsqu’on ajoute les carrés de chacun de ses chiffres, puis les
carrés des chiffres de ce résultat et ainsi de suite jusqu'à l’obtention d’un nombre à un seul chiffre égal à 1
(un).
Exemple :
N=7 est heureux, puisque :
72=49
42+92=97
92+72=130
12+32+02=10
12+02=1
On est arrivé à un nombre d’un seul chiffre qui est égal à 1, donc N=7 est heureux
Travail demandé :
Ecrire une fonction heureux(nb) qui permet de déterminer si un nombre entier nb est heureux ou non.
ð Correction
Exercice 2
La suite de robinson est définie par :
o U0=0
o Un se construit en concaténant le nombre d’apparition de chacun des chiffres constituant le terme
Un-1 suivi du chiffre lui-même, selon l’ordre décroissant des chiffres, pour tout n>0.
Exemple :
Pour n=5, U5=13123110
En effet :
o U0=0
o U1=10 car il y a une apparition (1) du chiffre 0 dans U0
o U2=1110 car il y’a une apparition (1) du chiffre 1 et une apparition (1) du chiffre 0 dans U1
o U3=3110 car il y’a une apparition (3) du chiffre 1 et une apparition (1) du chiffre 0 dans U2
o U4=132110 car il y’a une apparition (1) du chiffre 3, deux apparition du chiffre 1 et une apparition (1)
du chiffre 0 dans U3
o U5=13123110 car il y’a une apparition (1) du chiffre 3, une apparition du chiffre 2, trois apparitions
du chiffre 1 et une apparition (1) du chiffre 0 dans U3
Travail à faire :
Ecrire une fonction robinson(n) qui permet de calculer le Nième terme de la suite de robinson
ð Correction
Exercice 3
Un entier est dit distinct s’il est composé de chiffres distincts (différents).
Ecrire un programme python qui permet de saisir un entier n (n>0), puis de vérifier et d’afficher si cet entier
est distinct ou non.
Exemple :
N=1273 est dit distinct car il est formé par les chiffres 1, 2, 7 et 3 qui sont tous distincts, donc, le programme
affichera : cet entier est distinct
N=1565 est dit non distinct car il est formé par les chiffres 1, 5, 6, 5 qui ne sont pas tous distincts (le chiffre 5
se répète deux fois, donc le programme affichera : cet entier est non distinct
ð Correction
Exercice 1
Soit un fichier typé intitulé [Link] qui comporte les enregistrements relatifs aux candidats d’un
concours. Chaque enregistrement est composé de : NCIN, NOM, PRENOM, AGE, DECISION : (type
contenant les identificateurs suivants : admis, refusé, ajourné), et séparé par point virgule (;).
Travail demandé :
1. Définir la fonction saisir() qui permet de remplir les données relatives aux candidats dans le fichier
[Link], 1. L’arrêt de la saisie se fait en répondant à la question ("Saisir un nouveau candidat, (O
/ N) ? ")
2. Définir la fonction admis() qui permet créer le fichier [Link] comportant les données relatives aux
candidat admis
3. Afin de sélectionner en priorité les candidats admis et âgés moins de 30 ans, créer la fonction attente()
qui produira à partir du fichier [Link], un nouveau fichier intitulé [Link] comportant les données
relatives aux candidats admis et âgés plus que 30 ans. Une ligne du fichier [Link] comprend le
NCIN, le NOM et PRENOM d’un candidat séparé par point virgule (;).
4. Définir la fonction statistiques(dec) qui permet de retourner le pourcentage des candidats pour la
décision dec (admis, refusé et ajourné). Exemple : Le pourcentage des candidats admis = (Nombre
des candidats admis / Nombre des candidats) *100
5. Définir la fonction supprimer() qui supprimera du fichier [Link] les candidat âgés plus que 30
N.B : On suppose que les fichiers seront mis à la racine du lecteur C.
ð Correction
def saisir():
new='O' # O -> oui ; N -> non
fichier=open('[Link]','a')
decision={'a':'admis(e)','r':'refusé(e)','aj':'ajourné(e)'}
while new=='O':
cin=input('Saisir le Numéro CIN : ')
nom=input('Saisir le Nom : ')
prenom=input('Saisir le prenom : ')
age=input("saisir l'age ")
dec=input('saisir la décision a (admis(e)) ; r (refusé(e) ) ; aj (ajourné(e)) : ')
ligne=cin+';'+nom+';'+prenom+';'+age+';'+decision[dec]+'\n'
[Link](ligne)
def admis():
fichier=open('[Link]')
dest=open('[Link]','a')
def attente():
fichier=open('[Link]')
dest=open('[Link]','a')
def statistiques(dec):
fichier=open('[Link]')
L=[Link]()
[Link]()
for ligne in L:
L=[Link](';')
if L[4].strip()=='admis(e)':
[Link](ligne)
elif L[4].strip()=='refusé(e)':
[Link](ligne)
else:
[Link](ligne)
if dec=='admis':
return (len(L1)/len(L))*100
elif dec=='refusé':
return (len(L2)/len(L))*100
else:
return (len(L3)/len(L))*100
def supprimer():
fichier=open('[Link]')
Exercice 2
Après la réussite au baccalauréat, les meilleurs bacheliers sont orientés vers les classes préparatoires aux
grandes écoles. En effet, la priorité est à celui qui a le score (nombre de points) le plus élevé. Ce score est
appelé formule globale.
Les élèves admissibles seront classés par ordre décroissant selon la formule globale, Puis, une fois classés,
ces bacheliers seront divisés en 4 groupes de la façon suivante :
Nb
Groupe description Réparation
d’étudiants
40% (SMA) ; 30% (SMB) ; 20% (PC) ; 10%
Principale Liste principale 30
(SVT)
Tranche 3 Liste d’attente N°3 50 55% (SMA) ; 25% (SMB) ; 20% (PC) ;
Dans le répertoire C:/bachelier, on dispose d’un fichier nommé ‘[Link]’ contenant la liste des bacheliers
admissibles de la section Physique et sciences industrielles. Dans ce fichier, chaque bachelier est défini par :
▪ Num_insc : le numéro d’inscription
▪ NP : le nom et prénom
▪ FILIERE : le nom de la filière (SMA, SMB, PC ou SVT)
▪ MG : moyenne générale.
▪ FS (formule spécifique) : un réel déjà calculé à partir des notes obtenues dans les diverses matières.
▪ i : un réel=1 si l’élève est redoublant en BAC et 1.10 sinon
les informations sont séparées par point virgule( ;)
On souhaite réaliser les fonctions suivantes :
1. formule_gen() qui permet de créer un autre fichier ‘PSI_FG.txt’, à partir du fichier ‘[Link]’, et y
stocker, pour les mêmes bacheliers, les informations suivantes : Num_insc, NP, FILIERE et FG.
Sachant que la formule globale (FG) de chaque élève est calculée par l’équation :
FG=((5*MG+FS)*i)
2. classer() qui permet de classer les bacheliers du fichiers ‘PSI_FG.txt’ par ordre décroissant selon la
formule globale(FG).
N.B : pour faire cette tache, on doit transmettre les informations dans un tableau, les trier puis les
transmettre ordonnées dans le fichier, implémenter un algorithme de tri que vous voulez pour trier le
tableau
3. generer() qui permet d’extraire, dans le même répertoire, 4 autres fichiers (‘PSI_princ.txt’,
‘PSI_t1.txt’, ‘PSI_g2.txt’, ‘PSI_g3.txt’) contenant respectivement les bacheliers appartenant au
groupe liste principale, tranche 1, tranche2 et tranche3.
4. afficher(Num_insc) qui permet d’afficher, pour un candidat donné, en fonction de son numéro
d’inscription (donnée fournie en argument), le groupe auquel il appartient
ð Correction
def formule_gen():
source=open('[Link]')
dest=open('PSI_FG.txt','a')
for ligne in source:
s=[Link]()
tab=[Link](':')
fg=((5*float(tab[3])+float(tab[4]))*float(tab[5]))
etd=str(tab[0])+':'+str(tab[1])+':'+str(tab[2])+':'+str(fg)+'\n'
[Link](etd)
[Link]()
[Link]()
def classer():
source=open('PSI_FG.txt')
L=[Link]()
for i in range(len(L)-1):
m=i
for j in range(i+1,len(L)):
t1=L[j].strip().split(':')
t2=L[m].strip().split(':')
if float(t1[3])>float(t2[3]):
m=j
L[i],L[m]=L[m],L[i]
[Link]()
source=open('PSI_FG.txt','w')
[Link](L)
[Link]()
def generer():
l1=[]#SMA
l2=[]#SMB
l3=[]#PC
l4=[]#SVT
#classer()
#classer dans 3 listes les etudiants selon la filière
source=open('PSI_FG.txt')
for ligne in source:
t=[Link](':')
if t[2]=='SMA':
[Link](ligne)
elif t[2]=='SMB':
[Link](ligne)
elif t[2]=='PC':
[Link](ligne)
else:
[Link](ligne)
[Link]()
princ=open('PSI_princ.txt','a')
for i in range(nb1):
if i<len(l1):
[Link](l1[i])
for i in range(nb2):
if i<len(l2):
[Link](l2[i])
for i in range(nb3):
if i<len(l3):
[Link](l3[i])
for i in range(nb4):
if i<len(l4):
[Link](l4[i])
[Link]()
# construire la tranche 1
isma=nb1
ismb=nb2
ipc=nb3
isvt=nb4
nb1+=20
nb2+=10
nb3+=8
nb4+=2
princ=open('PSI_t1.txt','a')
for i in range(isma,nb1):
if i<len(l1):
[Link](l1[i])
for i in range(ismb,nb2):
if i<len(l2):
[Link](l2[i])
for i in range(ipc,nb3):
if i<len(l3):
[Link](l3[i])
for i in range(isvt,nb4):
if i<len(l4):
[Link](l4[i])
[Link]()
# construire la tranche 2
isma=nb1
ismb=nb2
ipc=nb3
isvt=nb4
nb1+=24
nb2+=18
nb3+=12
nb4+=6
princ=open('PSI_t2.txt','a')
for i in range(isma,nb1):
if i<len(l1):
[Link](l1[i])
for i in range(ismb,nb2):
if i<len(l2):
[Link](l2[i])
for i in range(ipc,nb3):
if i<len(l3):
[Link](l3[i])
for i in range(isvt,nb4):
if i<len(l4):
[Link](l4[i])
[Link]()
# construire la tranche 3
isma=nb1
ismb=nb2
ipc=nb3
nb1+=27
nb2+=12
nb3+=11
princ=open('PSI_t3.txt','a')
for i in range(isma,nb1):
if i<len(l1):
[Link](l1[i])
for i in range(ismb,nb2):
if i<len(l2):
[Link](l2[i])
for i in range(ipc,nb3):
if i<len(l3):
[Link](l3[i])
for i in range(isvt,nb4):
if i<len(l4):
[Link](l4[i])
[Link]()
def afficher(Num_insc):
princ=open('PSI_princ.txt')
L1=[Link]()
tr1=open('PSI_t1.txt')
L2=[Link]()
tr2=open('PSI_t2.txt')
L3=[Link]()
tr3=open('PSI_t3.txt')
L4=[Link]()
etat=False
tranche=''
CPGE_MPSI/PCSI Python
Algorithmique et programmation Langage python
Exercice 1
On donne une valeur K et un tableau T de N valeurs entières(N<50) tel que la valeur K ne figure pas
dans le tableau T (T[i]!=K ;i=1..N)
Ecrire une fonction deplacer(T,K)qui permet de déplacer les éléments du tableau T de manière à
regrouper en tête de celui-ci toutes les valeurs inférieures à K et en queue les valeurs supérieures à K
(sans utiliser un autre tableau).
Exemple :
Exercice 1
1 def deplacer (T , K ):
2 i =0
3 d = len ( T ) -1
4 while i < d :
5 if T [ i ] < k :
6 i +=1
7 else :
8 if T [ d ] < k :
9 T [ i ] , T [ d ]= T [ d ] , T [ i ]
10 else :
11 d -=1
Exercice 2
Soit une matrice A(n,m) de valeurs entières (n<50,m<100)
Ecrire une fonction trier(A) qui permet de faire un tri décroissant sur toutes les colonnes de la matrice A
Exemple :
CPGE_MPSI/PCSI
Algorithmique et programmation Langage python
Exercice 2
1 def Trier ( A ):
2 nl = len ( A ) # nombre de lignes
3 nc = len ( A [0]) # nombre de colonnes
4 for k in range ( nc ):
5 # tri par s e l e c t i o n
6 for i in range ( nl -1):
7 m=i
8 for j in range ( i +1 , nl ):
9 if A [ j ][ k ] > A [ m ][ k ]:
10 m=j
11 A [ i ][ k ] , A [ m ][ k ]= A [ m ][ k ] , A [ i ][ k ]
12 # fin tri par s e l e c t i o n
Exercice 3
Soit une matrice A de n ligne et m colonnes(n<100, m<50). Et soit le tableau T définie par rapport à la
matrice A comme suit : L’ième élémént de T représente le nombre d’éléments de la ligne i de A qui n’existe
pas dans la ligne i+1 (la ligne suivante si elle existe).
Exercice 3
1 def build ( A ):
2 nl = len ( A ) # nombre de lignes
3 nc = len ( A [0]) # nombre de colonnes
4 T =[ 0]*( nl -1)
5 for i in range ( nl -1):
6 nb =0
7 for j in range ( nc ):
8 print ( A [ i +1])
9 if A [ i ][ j ] not in A [ i +1]:
10 nb +=1
T [ i ]= nb
return T
CPGE_MPSI/PCSI
Algorithmique et programmation Langage python
Exercice 4
En mathématiques, une matrice stochastique (aussi appelée matrice de Markov) est une matrice carrée dont
chaque élément est un réel compris entre 0 et 1 et dont la somme des éléments de chaque ligne vaut 1. Cela
correspond, en probabilité, à la matrice de transition d'une chaîne de Markov finie.
Une matrice est dite bistochastique (ou doublement stochastique) si la somme des éléments de chaque ligne et
de chaque colonne vaut 1.
Voici un exemple de matrice stochastique P (dans cet exemple, la somme des éléments de chaque ligne est
égale à 1 ; on remarque que la somme des éléments de chaque colonne est quelconque):
Par exemple :
Si G est une matrice stochastique, alors on appelle vecteur stable pour G un vecteur h tel que :
Et
1. Ecrire une fonction eststochastique(P) qui permet de vérifier est ce que la matrice P est
stochastique ou non
2. Ecrire une fonction estbistochastique(P) qui permet de vérifier est ce que la matrice P
est bistochastique ou non
3. Ecrire une fonction vecteurstable(G, h) qui permet de vérifier est ce que h est un vecteur
stable de G ou non
CPGE_MPSI/PCSI
Algorithmique et programmation Langage python
Exercice 4
1 def e s t s t o c h a s t i q u e ( P ):
2 nl = len ( P ) # nombre de lignes
3 nc = len ( P [0]) # nombre de colonnes
4
5 etat = True # on suppose que la matrice est s t o c h a s t i q u e
6 for i in range ( nl ):
7 s =0
8 for j in range ( nc ):
9 s += P [ i ][ j ]
10 if s >1:
11 etat = False
12 break
13 return etat
14
15 def e s t b i s t o c h a s t i q u e ( P ):
16 nl = len ( P ) # nombre de lignes
17 nc = len ( P [0]) # nombre de colonnes
18
19 etat = True # on suppose que la matrice est b i s t o c h a s t i q u e
20 if ( e s t s t o c h a s t i q u e ( P )):
21 for j in range ( nc ):
22 s =0
23 for i in range ( nl ):
24 s += P [ i ][ j ]
25 if s >1:
26 etat = False
27 break
28 return etat
29
30 def v e c t e u r s t a b l e (G , h ):
31 nl = len ( G ) # nombre de lignes
32 nc = len ( G [0]) # nombre de colonnes
33 etat = True
34 if ( e s t s t o c h a s t i q u e ( G )):
35 for j in range ( nc ):
36 s =0
37 for i in range ( nl ):
38 s += h [ i ]* G [ i ][ j ]
39 if s != h [ j ]:
40 etat = False
41 break
42 else : 42
43 etat = False
44 return etat
CPGE_MPSI/PCSI