Esi 1an16 s1 Emd1 Algo16
Esi 1an16 s1 Emd1 Algo16
Esi 1an16 s1 Emd1 Algo16
EMD1 d’ALGORITHMIQUE
Exercice 2 (5pts)
1. Dérouler le module pour n = 71872687 ch=7 puis pour n = 1718171216 et ch = 1
2. puis donner lui un nom et un rôle à ce module
DEBUT
Res ← 0
Pour i allant de 1 à Nb_pos(N) Faire
Dpour
P ← Extr_Nb(N,1,i)
Si p <> ch Alors Res ← Concat(Res,p)
Fpour
CCCCCC ← Res
FIN
Nota : on aurait pu solutionner ce problème sans la modularité, cependant l’utilisation de cette dernière sera plus
appréciée. Et elle sera utilisée dans la solution présentée.
Découpage modulaire :
Le découpage est pratiquement implicite. On aura besoin :
• d’un module qui vérifie si un nombre est abondant (Module ABONDANT)
• d’un module qui vérifie si un nombre est supe abondant (module SUPABOND)
• et d’un module qui nous donne la somme des diviseurs propres d’un nombre (module SOMDIVP)
DEBUT
Si somdivP(n) > n Alors abondant ← VRAI
Sinon abondant ← Faux
FIN
DEBUT
Si abondant(n) Alors
Dsi
I←1
Res ← Vrai
TxN ← somdivp(n) / n
Répéter
Si abondant( i ) Alors
Dsi
Txi ← somdivP(i) / i
if Txi > txN then res ← Faux
Fsi
I ← i+1
Jusqu’à (i > n) OU (res = Faux)
SupAbond ← res
Fsi
Sinon supAbond ← Faux
FIN
DEBUT
Somme ← 1
Pour i allant de 2 à n div 2 Faire
Si n mod i=0 Alors somme ← somme+i
somdivP ← somme
FIN
Partie 2 :
• pour vérifier que trois nombres abondants se suivent , on prendra 3 variables AB1, AB2 , AB3 qui seront
initialisées à 0
• on prend une variable booléenne ( Triplet) qui nous permettra de savoir si nous avons trouvé un triplet. Elle
sera initialisée à Faux
• on va faire varier i =1, 2, 3, 4,……., et à chaque fois
o on vérifie si i est nombre abondant, si c’est le cas
on décale les contenus de AB1 et AB2 et on met i dans AB3, pour cela on met AB2
dans AB1, on met AB3 dans AB2 et on met I dans AB3, comme ça on aura toujours les 3
derniers nombres abondants
on vérifie si les trois nombres se suivent (AB2 – AB1 =1 ET AB3 – AB2 = 1) , si c’est le
cas , cela signifie que l’on a trouvé un triplet , alors on met Vrai dans triplet
on s’arrêtera lorsque triplet = vrai , on a trouvé le triplet recherché
• On affiche AB1, AB2 et AB3
Partie 3:
• Donner Nb, le nombre de nombres super abondants à afficher
• On met notre compteur (NBsup) à 0
• On fait varier i =1,2,3,4,…. Et à chaque fois
o Si i est un nombre super abondant
On l’affiche
On incrémente notre compteur Nbsup
On s’arrête lorsque NBsup = Nb , on a affiché nos NB nombres super abondants
ALGORITHME ed1_1516
Variables i, j ,ab1 ,ab2 ,ab3 ,nbsup ,nb : entier
tx , preTx : réel
triplet : booléen
Fonctions abondant.fon, somdivP, Supabond
DEBUT
//--------- Question 1 ------------------------------
i←0
Répéter
I ← i+1
Jusqu’à (abondant(i)) ET (i mod 2 <>0) ;
Ecrire ('le plus petit nombre abondant impair est : ', i)
//--------- question 2 ------------------------------
AB1 ← 0
AB2 ← 0
AB3 ← 0
triplet ← Faux
i←1
Répéter
Si abondant(i) Alors
Dsi
AB1 ← AB2
AB2 ← AB3
AB3 ← i
Si (ab2-ab1=1) and (ab3-ab2=1) Alors triplet ← Vrai
Fsi
i ← i+1
Jusqu’à (triplet = Vrai)
Ecrire ('le plus petit triplet de nombres abondants consecutifs est forme de : ', AB1, AB2, AB3)
//--------- Question 3 -----------------------------------------------
Ecrire (' Donner le nombre de nombres super abondants à afficher : ')
Lire (nb)
NBsup ← 0
i←1
répéter
if supAbond(i) Alors
Dsi
nbsup ← nbsup +1
Ecrire (nbsup,': ',i)
Fsi
i ← i+1
Jusqu’à nbsup = nb
FIN
PROGRAMMATION
program ed1_1516;
uses crt;
var i,j,ab1,ab2,ab3,nbsup,nb:longint ;
tx ,preTx:real;
triplet :boolean;
{$i E:\algo\modules\abondant.fon}
{$i E:\algo\modules\somdivP.fon}
{$i E:\algo\modules\SupAbond.fon}
BEGIN
clrscr;
//--------- Question 1 ------------------------------
i:= 0;
repeat
i:=i+1;
until (abondant(i)) and (i mod 2 <>0) ;
Writeln('le plus petit nombre abondant impair est : ',i);
writeln(' ----------------------------------------------');
Function SupAbond(n:longint):boolean;
// --------------------------------------------
// Donne VRAI si N est un nombre super abondant
// --------------------------------------------
var i:integer;
tx,pretx:real;
res :boolean;
{$i E:\algo\modules\abondant.fon}
{$i E:\algo\modules\somdivP.fon}
BEGIN
i:=1;
res:=true;
if abondant(n) then
Begin
Tx:= somdivp(n)/n;
repeat
if abondant(i) then
begin;
preTx:= somdivP(i)/i;
if preTx > tx then res:=false ;
end;
i:=i+1;
until (i > n) OR (res = false);
SupAbond:=res;
end
else supAbond:=false;
END;
FUNCTION somdivP(n:longint):longint;
(* -------------------------------------------------------------------- *)
(* retourne la somme des diviseurs propres de N excepte compris lui-meme
*)
(* -------------------------------------------------------------------- *)
var somme,i:longint;
BEGIN
somme:=1;
for i:=2 to n div 2 do
if n mod i=0 then somme:=somme+i;
somdivP:= somme;
END;
Function SupAbond(n:longint):boolean;
var i:integer;
txN,txI:real;
res :boolean;
{$i E:\algo\modules\abondant.fon}
{$i E:\algo\modules\somdiv.fon}
BEGIN
i:=1;
res:=true;
TxN:= somdiv(n)/n;
repeat
txi:=somdiv(i)/i;
if TxI > txN then res:=false ;
i:=i+1;
until (i > n) OR (res = false);
SupAbond:=res;
END;
QUESTION 2
Déroulement du 1er exemple
N Ch Res i p r CCCCCC
71872687 7 0
1 7
8 2 8
86 3 6
862 4 2
5 7
8628 6 8
86281 7 1
8 7 86281