Académique Documents
Professionnel Documents
Culture Documents
EMD1 d’ALGORITHMIQUE
Il y a des nombres très surprenants. Prenez par exemple le nombre (entier positif > 9) N = 197. Si
vous considérez ses x chiffres comme les premiers éléments d’une suite : 1 , 9 , 7 , et si ensuite chaque
élément est égal à la somme des x éléments précédents, il arrive de retomber sur le nombre de départ :
Par exemple si N = 197, on obtient la suite 1 , 9 , 7 , 17, 33, 57 , 107 , 197
197 est appelé un nombre de KEITH alors que 198 n’est pas un nombre de KEITH. En effet, pour 198 on
aura la suite suivante : 1 , 9 , 8 , 18 , 35, 61 , 114 , 210
C’est Michael KEITH qui a défini ces nombres en 1987. Ces nombres de KEITH sont aussi appelés les
Repfigits , (mot obtenu à partir de la contraction des mots repetitive Fibonacci-like digit).
Travail à Faire :
On vous demande de retrouver tous les nombres de KEITH composés de 2, 3 et 4 chiffres et de les
afficher sous la forme suivante :
(Extrait du résultat)
Nota : nous avons limité exprès la taille de N à 2,3 ou 4 chiffres pour 2 raisons. La première est qu’il nous faut travailler avec des
objets élémentaires (nous n’avons pas encore fait des Exos sur les données structurées), la seconde est pour éviter des algorithmes
trop longs. Car une fois que l’on aura compris comment ça marche pour des nombres de 2 ou 3 chiffres, il est très facile de
généraliser ( sans dépasser les limites des entiers longs bien entendu).
1. Découpage modulaire :
On aura besoin d’un module qui vérifie si un nombre est un nombre de Keith ou pas et d’un module qui nous affiche
les suites des nombres selon le format donné, que ce nombre soit de Keith ou pas (on pourra ainsi l’utiliser dans
d’autres cas). Par la suite comme il est demandé de n’afficher que les suites correspondant aux nombres de Keith,
nous devons d’abord vérifier si notre nombre est un nombre de Keith et si c’est le cas on affiche la suite lui
correspondant. Cet affichage peut être intégré dans l’algorithme principal, mais nous proposons un module pour rendre
notre algorithme principal très simple à construire.
Par ailleurs il faut extraire les différents chiffres du nombre de départ et connaître le nombre de positions d’un nombre
(ces 2 modules sont donnés dans le sujet).
Fonction
N : entier AfSuiteN
Rôle :affiche une suite dont chaque élément est égal aux x éléments qui le précèdent (x =2,3,ou 4
selon que N contient 2,3 ou 4 positions – la suite s’arrête lorsqu’un élément est > N)
Analyse :
Puisque notre nombre est composé de 2, 3 ou 4 chiffres, il suffit de
Faire varier x de 10 à 9999 et à chaque fois
o Si X est un nombre de Keith , on affiche la suite lui correspondant
Algorithme emd1
Variable x : Entier
Fonctions Keith et afSuiteN
DEBUT
Ecrire ('Les nombres de Keith composes de 2, 3 et 4 chiffres sont : ')
Pour X allant de 10 à 9999 Faire
Si keith (x) Alors
afSuiteN (x)
FIN
Nota : un indice dans l’énoncé nous oriente vers les suites de Fibonacci. Nous allons donc nous en inspirer pour notre
analyse.
Analyse :
Il faut d’abord décomposer N en ses x différents chiffres. Lesquels vont constituer les premiers éléments de la suite.
Ensuite chaque élément est = somme des x derniers éléments. Donc :
si N est composé de 2 chiffres :
o On extrait le 1er chiffre C1 qui devient le 1er élément de la suite
o On extrait le 2ième chiffre C2 qui devient le 2ième élément de la suite
o On répète ce qui suit :
Le prochain élément ELEM = C1 + C2
On met C2 dans C1 // C2 devient le 1er élément
On met ELEM dans C2 // ELEM devient le 2ième élément
On s’arrête lorsque (ELEM = N) OU (ELEM > N) // c’est un nombre de Keith ou non
o Si ELEM = N donc N est un nombre de Keith
Si N est composé de 3 chiffres :
On refait la même chose que précédemment mais on aura besoin des 3 premiers éléments C1,C2 et C3
Si N est composé de 4 chiffres :
On refait la même chose que précédemment mais on aura besoin des 4 premiers éléments C1,C2,C3 ,C4
Nota : on observe que pour généraliser, on peut aller jusqu’à N composé de 9 chiffres. Mais si l’analyse est facile ,
l’algorithme est un peu long. Une solution plus élégante est possible avec les tableaux.
DEBUT
Si Nb_Pos(N) = 2 Alors
Dsi
c1 extr_Nb(N,1,1)
c2 extr_Nb(N,1,2)
Répéter
Elem c1+c2
c1 c2
c2 elem
Jusqu’à (n = elem) OU (elem > n)
Fsi
Sinon
Si Nb_Pos(N) = 3 Alors
DSI
c1 extr_Nb(N,1,1)
c2 extr_Nb(N,1,2)
c3 extr_Nb(N,1,3)
Répéter
Elem c1+c2+c3
c1 c2
c2 c3
c3 elem
Jusqu’à (n = elem) OU (elem > n)
FSI
Sinon
Si Nb_Pos(N) = 4 Alors
DSi
c1 extr_Nb(N,1,1)
c2 extr_Nb(N,1,2)
c3 extr_Nb(N,1,3)
c4 extr_Nb(N,1,4)
Répéter
Elem c1+c2+c3+c4
c1 c2
c2 c3
c3 c4
c4 elem
Jusqu’à (n = elem) OU (elem > n)
Fsi
Si elem = n Alors Keith Vrai
Sinon Keith Faux
FIN
3. Construction de AfSuiteN
Nota : cette partie du problème aurait pu être traitée dans l’algorithme principal, mais nous avons privilégié de la
modulariser , car elle est extraite en très grande partie du module Keith mais de plus notre algorithme principal sera
énormément simplifié et de plus le module pourra être réutilisé.
Analyse :
Dans notre analyse nous allons reprendre la même analyse que celle du module de Keith, en y insérant seulement des
écritures pour afficher les premiers éléments de la suite , et lorsque l’on calcule un élément. On affiche donc les
éléments d’une suite que N soit un nombre de Keith ou pas. Donc
si N est composé de 2 chiffres :
o On extrait le 1er chiffre C1 qui devient le 1er élément de la suite
o On extrait le 2ième chiffre C2 qui devient le 2ième élément de la suite
o On écrit C1 et C2
o On répète ce qui suit :
Le prochain élément ELEM = C1 + C2
On écrit Elem
On met C2 dans C1 // C2 devient le 1er élément
On met ELEM dans C2 // ELEM devient le 2ième élément
On s’arrête lorsque (ELEM = N) OU (ELEM > N) // c’est un nombre de Keith ou non
Si N est composé de 3 chiffres :
On refait la même chose que précédemment mais on aura besoin des 3 premiers éléments C1,C2 et C3
Si N est composé de 4 chiffres :
On refait la même chose que précédemment mais on aura besoin des 4 premiers éléments C1,C2,C3 ,C4
Procédure Keith ( n : Entier ) : booléen
Variables c1,c2,c3,c4,c5,c6,c7,c8,c9,elem : Entier
Fonctions extr_Nb et Nb_pos
DEBUT
Si Nb_Pos(N) = 2 Alors
Dsi
c1 extr_Nb(N,1,1)
c2 extr_Nb(N,1,2)
écrire (C1, C2)
Répéter
Elem c1+c2
Ecrire (elem)
c1 c2
c2 elem
Jusqu’à (n = elem) OU (elem > n)
Fsi
Sinon
Si Nb_Pos(N) = 3 Alors
DSI
c1 extr_Nb(N,1,1)
c2 extr_Nb(N,1,2)
c3 extr_Nb(N,1,3)
écrire (C1, C2, C3)
Répéter
Elem c1+c2+c3
Ecrire (elem)
c1 c2
c2 c3
c3 elem
Jusqu’à (n = elem) OU (elem > n)
FSI
Sinon
Si Nb_Pos(N) = 4 Alors
DSi
c1 extr_Nb(N,1,1)
c2 extr_Nb(N,1,2)
c3 extr_Nb(N,1,3)
c4 extr_Nb(N,1,4)
écrire (C1, C2, C3,C4)
Répéter
Elem c1+c2+c3+c4
Ecrire (elem)
c1 c2
c2 c3
c3 c4
c4 elem
Jusqu’à (n = elem) OU (elem > n)
Fsi
FIN
BEGIN
write(N,' : ');
If Nb_Pos(N)=2 then
BEGIN
c1:=extr_Nb(N,1,1);
c2:=extr_Nb(N,1,2);
write(c1,',',c2,',');
repeat
elem:=c1+c2;
Write(elem,',');
c1:=c2;
c2:=elem;
until (n = elem) or (elem > n);
END
else
If Nb_Pos(N)=3 then
BEGIN
c1:=extr_Nb(N,1,1);
c2:=extr_Nb(N,1,2);
c3:=extr_Nb(N,1,3);
write(c1,',',c2,',',c3,',');
repeat
elem:=c1+c2+c3;
c1:=c2;
c2:=c3;
c3:=elem;
Write(elem,', ');
until (n = elem) or (elem > n);
END
else
If Nb_Pos(N)=4 then
BEGIN
c1:=extr_Nb(N,1,1);
c2:=extr_Nb(N,1,2);
c3:=extr_Nb(N,1,3);
c4:=extr_Nb(N,1,4);
write(c1,',',c2,',',c3,',',c4,',');
repeat
elem:=c1+c2+c3+c4;
c1:=c2;
c2:=c3;
c3:=c4;
c4:=elem;
Write(elem,',');
until (n = elem) or (elem > n);
END;
writeln;
END;
**************************************************************************************
BAREME
1. Ce corrigé est un corrigé type, toute autre solution sera retenue dans la mesure où elle est cohérente
et les concepts appliqués
2. La démarche doit être modulaire ( au moins pour vérifier si N est un nombre de Keith ) sinon la note
finale est divisée par 2) – exception faite éventuellement à la partie affichage
3. Tenir compte :
de la Structuration des idées dans l’analyse, la clarté, la précision, la concision et le soin
4. tout travail non soigné ne pourra en aucun cas prétendre à la note max. prévue dans le barème !
ALGORITHME (4 pts)
décomposition du nombre initial : ½ pt
calcul d’un élément : ½ pt
test de fin de la boucle ( de la forme Répéter) : ½ pt
détermination d’un nombre de Keith : ½ pt
prise en charge des nombres de 2, 3 et 4 positions : 1 pt
respect du formalisme : 1 pt ( être intransigeant sur le formalisme –
entête – déclarations – format des actions – indentation – blocs bien
apparents – encadrement – présentation) : sanctionner en fonction de
votre appréciation de la faute
Affichage selon le les erreurs les plus classiques que j’entrevois sont :
format donné et 1. pas de module pour l’affichage : pas de sanction
algorithme principal 2. on affiche que le nombre de Keith (et pas la suite) : note max 1 pt
6 pts 3. on affiche toutes les suites (keith ou pas) : note max 3 pt
pour une solution correcte et (intelligente !) on doit retrouver, en
principe, la même analyse et le même algorithme que pour la recherche
d’un nombre de Keith.