Académique Documents
Professionnel Documents
Culture Documents
2023/2024 C.Smaili
Série 1
Exercice 1
Le Crible d’Eratostène est un algorithme classique pour énumérer les nombres premiers. Supposons
que nous voulions trouver les nombres premiers plus petits que 10. Commençons par écrire les
nombres de 2 à 10 : 2 3 4 5 6 7 8 9 10
Nous sélectionnons le plus petit (c’est-à-dire : 2), certains qu’il est premier, et nous retirons tous ses
multiples. Après cette première étape, nous avons : 2 3 5 7 9.
A la seconde étape, nous savons que 3 est premier. Nous retirons tous ses multiples. Après cette
seconde étape, nous avons : 2 3 5 7.
A la troisième étape, nous savons que 5 est premier. Nous retirons tous ses multiples. Après cette
étape, nous avons : 2 3 5 7.
A la quatrième étape, nous savons que 7 est premier. Nous retirons tous ses multiples. Après cette
étape, nous avons trouvé les nombres premiers plus petits que 10 :
2 3 5 7
Après l’initialisation d’un tableau avec les entiers suivants : 2…1000, suivre le principe énoncé ci-
dessus pour afficher les nombres premiers plus petits que 1000.
Exercice 2
Le but de cet exercice est de construire le triangle de Pascal (voir le tableau ci-dessous) pour un
nombre de lignes donné. Le nombre de colonnes est égal au nombre de lignes. On envisage ici deux
méthodes : la première utilise un tableau à deux dimensions et la deuxième utilise un tableau à une
dimension.
1. Écrire l’algorithme de construction du triangle de pascal pour un nombre de lignes donné. La
taille maximale de la matrice est de [100,100].
2. Afficher les éléments de cette matrice. Afficher uniquement les éléments du tringle.
3. Écrire une action qui, à partir de la ligne n du triangle de Pascal stockée dans un tableau à une
dimension de taille 100, calcule les valeurs de la ligne n+1 en effectuant une mise à jour du
tableau sans utiliser de tableau intermédiaire. Le tableau est supposé d’une taille suffisante
(n<100).
4. On souhaite imprimer, parmi les 100 premières lignes du triangle de Pascal, toutes celles qui
ne contiennent que des valeurs strictement inférieures à un nombre strictement positif donné
nb>1. Pour résoudre ce problème, on vous demande d’utiliser l’action de la question
précédente pour calculer et afficher une à une les lignes du triangle de Pascal jusqu’à la
première ligne contenant une valeur supérieure ou égale au nombre nb donné strictement
positif. Cette ligne ne sera pas affichée. Si on atteint la ligne 100 sans avoir trouvé, on s’arrête.
La valeur de nb est saisie au clavier. On choisit de ne pas afficher les 0 présents dans une
ligne. Écrire le programme correspondant.
1
Faculté informatique Module ALGO L2-ACAD C
2023/2024 C.Smaili
Exercice 3
Le but de cet exercice est de construire une pyramide composée de N lignes en commençant par un
nombre x donné (voir l’exemple ci-dessous pour x=1). Chaque ligne est calculée en fonction de la
ligne qui la précède en insérant à son début et à sa fin un chiffre C égal à :
(la somme de ses chiffres + sa longueur) mod 10
1
212
82128
6821286
…………………....
……………..………....
2
Faculté informatique Module ALGO L2-ACAD C
2023/2024 C.Smaili
LISTES
Exercice 1
1. Initialiser une liste simplement chaînée avec les entiers suivants : 2…1000.
2. En suivant le principe donné par le Crible d’Eratostène, construire la liste des nombres
premiers plus petits que 1000. Afficher cette liste.
Exercice 2
Ecrire une fonction qui interclasse 2 listes d'entiers triées par ordre croissant (sans perdre les listes
initiales).
Exercice 3
Partie I : Etant donnée la suite suivante ; on part d'un entier P ≥ 2 :
S’il est pair, on le divise par 2, on obtient P/2
S’il est impair, on le multiplie par 3 et l'on ajoute 1, on obtient 3×P +1
On recommence avec le nouveau nombre obtenu jusqu’à obtenir le chiffre 1. Dans l’algorithme
principal :
1. Donnez le type de cette liste
2. Lisez un entier positif P ≥ 2 puis créez sa suite. Exemple : pour P =5, on obtient :
3. Affichez cette suite
T 5 16 8 4 2 1
Partie II : A partir de la liste T (voir la question 2), créez 2 listes T1 et T2 contenant respectivement les
nombres pairs et impairs de T. Exemple : pour la liste T ci-dessous, on obtient :
T1 12 6 10 16 8 4 2
nil
T 12 6 3 10 5 16 8 4 2 1
nil T2 3 5 1
nil
Exercice 4
À partir d’une liste d’entier quelconque (non triée) on veut créer une liste triée par ordre croissant. La
procédure à suivre est la suivante :
1. Donner le type de cette liste
2. Créer la liste d’origine en utilisant la fonction suivante:
Fonction Creation_liste(E/ Tete1 : Liste) : Liste
Tant qu’il reste des éléments dans cette liste (liste d’origine)
Faire
3. Chercher le maximum :
Fonction Chercher_Max(E/ Tete1 : Liste) : entier
4. Libérer ce maximum de cette liste :
Fonction Liberer_Max_Element (E/ Tete1 : Liste, E/ max : entier) : Liste
5. Créer un nouvel élément de la liste résultat :
Fonction Creation_Element_Liste(E/ Tete2 : Liste, E/max : entier) : Liste
Fait
6. Afficher la liste résultat : Procedure Affiche_Liste(E/ Tete2 : Liste)
3
Faculté informatique Module ALGO L2-ACAD C
2023/2024 C.Smaili
Exercice 4.1 (même exercice mais dans ce cas pas de libération ni allocation d’espace)
Tant qu’il reste des éléments dans cette liste (liste d’origine)
Faire
2. Chercher le maximum :
Fonction Chercher_Max(E/ Tete1 : Liste) : Liste //la fonction retourne l’adresse du Max
3. Créer un nouvel élément de la liste résultat :
Procedure Creation_Element_Liste(ES/ Tete1, Tete2 : Liste, E/Pmax : Liste)
Fait
4. Afficher la liste résultat : Procedure Affiche_Liste(E/ Tete : Liste)
Exercice 5
On veut construire le triangle de Pascal pour un nombre de lignes donné en utilisant un tableau et
plusieurs listes chainées. Les étapes à suivre sont données comme suit :
1 1 1
1 1 2 1
1 1 3 3 1
1 1 4 6 4 1
1 1 4 6 4 1
Faculté informatique Module ALGO L2-ACAD C
2023/2024 C.Smaili
Exercice 6
1. Ecrire une procédure Ajout_Début_Fin (T : liste, Q : liste, x : entier) qui insert la valeur x en
tête et en queue d’une liste simplement chaînée. Exemple
(b)pour
Aprèsx= l’appel
5, on obtient :
de la fonction
Q Q T Q T Q
T T
5 1 5 1 5
5 1 5
Problème : On commence par un chiffre x donné (voir l’exemple ci-dessous pour x=1). Chaque
nouveau nombre est calculé en fonction du nombre qui le précède en insérant à son début et à sa fin un
chiffre C : C = (la somme de ses chiffres + sa longueur) mod 10
1
212
82128
6821286
…………………....
……………..………....
4. En utilisant les actions ci-dessus, écrire l’algorithme de construction de la liste chaînée pour
un chiffre x où 1 ≤ x ≤ 9.
Remarque : La construction s’arrête dès que le nombre d’éléments dépasse une valeur val1
strictement positif ou la somme des valeurs de la liste et supérieur val2.
2. En déplaçant la queue de la liste circulaire (voir la figure 2), écrire une action paramétrée qui à
partir de la liste circulaire de caractère, construit toutes les chaînes possibles (sauf la chaîne
initiale) et sauvegarde ces mots dans une liste simplement chaînée.
Remarque : traiter les cas particuliers suivants : ch=’’ABAB’’, ch= ‘’A’’, ch=’’AAA’’, …
Queue
A B A B A B
Queue D C D C D C Queue
Figure 2 : liste simplement chaînée correspondant à toutes les chaînes possibles en déplaçant la queue de l
CDAB EF UST
TUS
BCDA
DABC
Figure 3: liste de N=3 chaînes de caractère où chaque chaîne est attachée une liste représentant toutes les combinaisons po
Départ
Exercice 8
L'objectif de cet exercice est d'analyser les résultats d'un athlète dans une
course. Soit T un nombre de 8 chiffres représentant le résultat d'un tour
réalisé par un athlète. Les deux premiers chiffres à gauche indiquent la durée
6
Faculté informatique Module ALGO L2-ACAD C
2023/2024 C.Smaili
en secondes du premier quart d'un tour : Q1, les deux chiffres suivants indiquent la durée en secondes
du deuxième quart d'un tour : Q2, et ainsi de suite :
Pour T = 25282621 :
Q1 = 25 secondes (s), Q2 = 28s, Q3 = 26s, Q4 = 21s
1. Ecrire une action paramétrée TOUR permettant de créer une liste circulaire L contenant le résultat
d'un tour (voir exemple ).
Exemple 25 28 26 21
Pour T = 25282621 L
2. Ecrire une action paramétrée COURSE permettant de créer une liste R contenant le résultat d'une
course de N tours fait par un athlète (voir exemple ). Les résultats de chaque tour réalisés par
l'athlète sont sauvegardés dans un vecteurs V d'entiers.
Exemple 25 28 26 21
Pour N = 2 R
23 27 20 29
NIL
3. Ecrire une action paramétrée MEILLEUR permettant de créer une liste simplement chaînée M
contenant les numéros des K meilleurs quarts de la course (voir exemple ). Expliquer votre
méthode en un paragraphe.
Exemple
Pour K = 5, les numéros des K meilleurs quarts de l'exemple sont : 1, 3, 4, 1, 3
4. En utilisant la liste M, écrire une action paramétrée FREQUENCE permettant de déterminer pour
chaque quart, sa fréquence d'apparition dans M (voir exemple ).
Exemple
1 4 3 Quart
2 1 2 Fréquence
NIL
(L'utilisation des structures de données intermédiaires autre que les listes n'est pas autorisée.)
Exercice 9
7
Faculté informatique Module ALGO L2-ACAD C
2023/2024 C.Smaili
A partir d’un nombre entier positif x, on veut générer tous les nombres possibles en suivant le principe
suivant : pour chaque chiffre constituant ce nombre, on génère deux nombres, en allant vers la droite
puis vers la gauche de ce chiffre.
Exemple : pour le nombre 216 et en commençant par le chiffre 6 on génère : 621
(6*102+2*101+1*100) puis 612 (6*102+1*101+2*100).
Pour le chiffre 2 on génère : 216 puis 261. Pour le chiffre 1 on génère : 162 puis 126. Ce même
principe est appliqué pour l’ensemble: {15, 7, 191} illustré par la figure 1. Notons qu’on ne tient pas
compte des doublons et du nombre initial s’il est généré. Voir le cas de 191 par exemple. En
appliquant ce principe, on vous demande :
4. Donner le(s) type(s) de la structure représentée par la figure 1.
5. Ecrire une action paramétrée qui construit une liste circulaire bidirectionnelle composée
uniquement des chiffres d’un nombre entier positif (voir la figure 2).
6. En utilisant uniquement la queue de la liste circulaire bidirectionnelle comme paramètre d’une
action paramétrée, construisez la liste de tous les nombres possibles en suivant le principe donné en
haut de cet exercice (voir la figure 3).
Remarque : à exclure les doublons et le nombre initial voir par exemple pour le nombre 191.
15 7 191 Queue
nil 2 1 6
nil
51 119 911
nil nil
Figure 2on
Figure 1: liste de N entier (15, 7, 191). Pour chaque chiffre d’un nombre, : liste circulaire
génère bidirectionnelle
deux nombres correspondant
en en suivant audonné
le principe nombre 201
ci-dessus
Q1 Q2 Q3
2 0 1 2 0 1 2 0 1
21 12
8nil
Etape 1 Etape 2 Etape 3
Figure 3 : étapes de construction de tous les nombres possible à partir d’une liste circulaire bidirectionnelle représentant le nombre 201
Faculté informatique Module ALGO L2-ACAD C
2023/2024 C.Smaili
PILE et FILE
Exercice 1
Etant donné N entiers strictement positifs. On veut afficher les nombres parfait de cet ensemble en
suivant les étapes suivantes (voir les figures 1,2 et 3):
1. Donner la définition des deux tableaux : Tete, Queue
2. Initialiser Tete et Queue (voir figure 1)
3. Créer pour chaque élément du tableau un enregistrement avec la valeur 1 représentant le
premier diviseur. Mettre l’adresse de cet élément dans le tableau Tete et dans le tableau
Queue (voir figure 2)
4. Utiliser l’action Enfiler pour construire la liste des diviseurs pour chaque valeur du tableau
(voir figure 3)
5. Pour chaque élément du tableau afficher ses diviseurs
6. Transformer la fonction Affiche ( ) pour afficher les nombres parfaits du tableau
3 3 1 3 1 3
8 8 1 8 1 2 4 8
11 11 1 11 1 11
1 1 1 1 1
Exercice 2
Une image en informatique peut être représentée par une matrice de points ayant N lignes et M
colonnes. Un élément Image[x, y] de la matrice représente la couleur du point de coordonnées (x, y).
En utilisant la pile comme structure de donnée, on propose d’écrire ici une action paramétrée qui, à
partir d’un point p, étale une couleur c autour de ce point. Pour effectuer le remplissage, on doit aller
dans toutes les directions à partir d’un point de départ. La progression de la couleur étalée s’arrête
quand elle rencontre une couleur autre que celle du point p. La figure suivante illustre cet exemple, en
considérant le point noir se trouvant dans la case (4, 6). Pour effectuer le remplissage, on doit aller
dans toutes les directions à partir du point noir.
9
Faculté informatique Module ALGO L2-ACAD C
2023/2024 C.Smaili
Exercice 3
Etant donné une matrice carrée T [N][N] où N > 1 et N est impair. On veut représenter un triangle
dans la moitié supérieure de cette matrice en mettant à jour certaines cases de la matrice T. Pour
effectuer le remplissage du triangle on procède comme suit : à chaque fois qu’on met à jour une case
par un ‘1’, on sauvegarde les coordonnées entourant cette case (gauche, droite, haut et bas) dans une
PILE.
1. Définissez le type « coordo » représentant les coordonnées (x, y) d’une matrice et donnez le type
de la pile.
2. Réécrivez les deux actions Dépiler et Empiler en tenant compte du nouveau type « coordo ».
3. Ecrivez une action (non récursive) qui place des ‘1’ dans la partie supérieure de la matrice T en
suivant le principe énoncé ci-dessus.
Note : on prend comme configuration initiale les deux côtés du triangle et une position initiale à
l’intérieur du triangle : T [2][4] ≠1 (voir par exemple la figure 1). Le résultat final est donné par la
figure 2.
Exercice 4
On veut générer des nombres en suivant le principe suivant : on commence par un chiffre x donné : 1
≤ x ≤ 9, voir l’exemple ci-dessous pour x=1. Chaque nouveau nombre est calculé en fonction du
nombre qui le précède en insérant à son début et à sa fin un chiffre C :
C = (la somme de ses chiffres + sa longueur) mod 10
1 C = (1 + 1) mod 10 = 2
212 C = (5 + 3) mod 10 = 8
82128 C = (21 + 5) mod 10 = 6
6821286
……………….
En utilisant uniquement deux piles (représentées de façon chaînées), voici les étapes à suivent :
2
2 1
1 1 2
P1 P2 P1 P2 P1 P2
Etape initial Etape 1 Etape 2
Etat initial : empiler le chiffre donné par l’utilisateur dans la pile P1
Etape 1 : désempiler tous les éléments de P1 et les empiler dans P2 en comptant le nombre d’éléments
(nb=1) et la somme des valeurs (som=1). Empiler la valeur C= 2 dans P2 : C= (1 + 1) mod 10 = 2
Etape 2 : désempiler tous les éléments de P2 et les empiler dans P1. Empiler la valeur C dans P1.
Recommencer les étapes 1 et 2 jusqu’à :
10
Faculté informatique Module ALGO L2-ACAD C
2023/2024 C.Smaili
le nombre d’éléments dépasse une valeur val1 >1 (donnée par un utilisateur) ou
la somme des valeurs de la liste et supérieur val2 > 1 (donnée par un utilisateur)
Remarque :
Il est judicieux de procéder au calcule d’un nombre à chaque fois qu’on empile un chiffre.
Utiliser les procédures de manipulation de la pile vues en cours : Empiler (tete, x) et Désempiler (tete,
x)
RECURSIVITE
Exercice 1:
En se référant à l’exemple donné par la figure 1 :
1. Donner l’écriture mathématique des suites : Un+1 et Vn+1 pour n≥0
2. Donner le cas trivial (qui assure l’arrêt des appelles) de chaque suite
3. Ecrire les actions récursives U ( ) et V ( )
4. Calculer U5 et V7
*1 U(3)
2*
=
U(2) V(2)
* 1 = 2* *3 = - 1*
U(1) V(1) U(1) V(1)
1
* = 2* 3
* = - 1*
1
* = 2* 3
* = - 1*
U(0) V(0) U(0) V(0) U(0) V(0) U(0) V(0)
1 2 1 2 1 2 1 2
Figure1 : Exemple d’un arbre binaire pour la suite U(n) avec n=3
Exercice 2
1. Soit N un entier positif. Ecrire une fonction récursive qui remplace le(s) chiffre(s) : 2 dans N
par le chiffre 9.
Exemple : N=2093287 on aura : 9093987
2. Ecrire une action récursive qui retourne le nombre de chiffre d’un entier positif.
Exercice 3
1. Ecrire une action paramétrée récursive Affiche_R1( ) qui affiche les éléments d’une liste
d’entier. On commence par afficher le dernier élément, avant dernier,…, premier.
2. Ecrire une seconde action paramétrée récursive Affiche_R2( ) qui affiche les éléments de la
structure de la figure ci-dessous. Penser à utiliser la fonction récursive Affiche_R1( ) dans le
corps de la seconde action. Les nombres seront affichés dans cet ordre : 191 : 911 119 7 :
15 : 51
11
Faculté informatique Module ALGO L2-ACAD C
2023/2024 C.Smaili
3. Ecrire une action paramétrée récursive Efface_R2( ) qui libère l’espace mémoire occupé par
la structure de la figure ci-dessous. Penser à utiliser le même principe donné par les questions
1 et 2 : les éléments seront libérés dans cet ordre : 911 119 191 7 51 15
Tete
15 7 191
nil
nil
51 119 911
nil nil
Exercice 4
Etant donné une matrice carrée T [N][N] où N > 1 et N est impair. On veut représenter un triangle
dans la moitié supérieure de cette matrice en mettant à jour certaines cases de la matrice T.
1. Écrire une action paramétrée récursive afin de représenter un triangle dans la moitié
supérieure de la matrice T.
2. Écrire une action paramétrée récursive afin de représenter un triangle dans la moitié
inférieure de la matrice T.
3. En s’inspirant des deux questions précédentes, écrire une action paramétrée récursive dans le
but de représenter un losange (voir la figure ci-dessous).
Fig 3 : Représentation d’un losange
Fig 1 : Représentation d’un triangle Fig 2 : Représentation d’un triangle dans une matrice T[7][7]
dans une matrice T[7][7] dans une matrice T[7][7]
Exercice 5
Dans cet exercice, on définit une matrice carrée T(N,N) comme un tableau à deux dimensions où le
nombre de lignes est égal au nombre de colonnes et N>1. Étant donné les actions paramétrées ci-
dessous, on vous demande de :
1. Dérouler l’action paramétrée F en tenant compte des initialisations suivantes : L=5, CC=L,
LL=L, DL=1, DC=1. L et val sont des variables globales initialisées à 5 et à 1 respectivement.
Remplissez la matrice T[L][L] et décrire en quelques mots le résultat de cette action.
Expliquer en quelques mots si cette action est récursive terminale ou non.
.
Procédure LGD(E/ T[L][L] ,DL CC :entier) Procédure CHB(E/ T[L][L], DL, LL, CC :entier)
Début Début
k : entier k : entier
pour k de DL à CC faire pour k de DL+1 à LL faire
T [DL][k]val ; T [k][CC]val ;
ftanq ftanq
Fin Fin
Procédure CBH(E/ T[L][L] , LL, DL, DC :entier) Procédure LDG(E/ T[L][L], CC, DC, LL :entier)
12
Faculté informatique Module ALGO L2-ACAD C
2023/2024 C.Smaili
Début Début
k : entier k : entier
pour k de LL-1 à DL+1 pas-1 faire pour k de CC-1 à DC pas-1 faire
T [k][DC]val ; T [LL][k]val ;
ftanq ftanq
Fin Fin
Procédure F (E/ T[L][L], LL, CC, DL, DC :entier)
Début
si (LL >DL et CC >DC)
alors LGD (T, DL, CC) ;
CHB (T, DL, LL, CC) ;
LDG (T, CC, DC, LL) ;
CBH (T, LL, DL, DC) ;
valval+1 ;
F (T, LL-1, CC-1, DL+1, DC+1) ;
Fsi
Fin
Exercice 6
Dans une chaîne amiable, chaque nouveau nombre est égal à la Somme des Diviseurs Propres (SDP)
(autres que lui-même) du précédent. La somme du dernier étant égale au premier nombre. Le nombre
en question est dit sociable (voir l’exemple donné dans le tableau 1).
1. Ecrire une fonction récursive qui vérifie si un nombre N est sociable ou non.
2. Dans le programme principal lisez un entier positif N et afficher le message suivant : N est sociale /
N n’est pas sociable.
Remarque :
Il est recommandé de créer une fonction qui retourne la SDP d’un entier N positif.
Si N n’est pas sociable, la SDP de l’ième élément ne sera jamais égale au premier. On prévoit alors
de transmettre un autre paramètre : borne=100 à la fonction. Si le nombre d’éléments créés dépasse
ce paramètre, alors N ne vérifie pas la définition d’une chaîne amiable.
13