Sunteți pe pagina 1din 4

CEL MAI MARE DIVIZOR COMUN IN C++

Functia cmmdc() calculeaza divizorul comun maxim dintre a si b si depune rezultatul n c. ntruct nu transmite date prin lista de parametri si nu ntoarce vreun rezultat, functia va avea prototipul void cmmdc(): #include <stdio.h> unsigned long a, b, c; // variabile externe // definirea functiei cmmdc() void main(void) { scanf(%lu%lu, &a, &b); printf(%lu / %lu = , a, b); cmmdc(); a/=c; b/=c; printf(%lu / %lun, a, b); } Definitia functiei cmmdc()din Exemplul 11, este: void cmmdc() { unsigned long r; do { r=a%b; a=b; b=r; } while (r); c=a; } Dndu-se dou numere ntregi a i b, se cere s se calculeze cel mai mare divizor comun al lor. Date de intrare Datele de intrare (Di) pentru aceast problem sunt constituite din cele dou numere ntregi a i b. Date de ieire Datele de ieire (De) sunt date de cel mai mare divizor comun al celor dou numere. Rezolvare a) Raionamentul de rezolvare (R) Pentru a rezolva aceast problem trebuie inut cont de teorema mpririi cu rest. Considerm urmtorul ir de mpriri succesive: a = b c1+ r1, b > r1 b = r1 c2+ r2, r1> r2 r1= r2 c3+ r3, r2> r3 r2= r3 c4+ r4, r3> r4 ...

r n-1= r n c n+1+ rn+1, r n> r n+1 Se poate observa c irul resturilor (r i)i>0 este mrginit, descresctor i convergent ctre 0. Pentru cazul n care r n+1 este egal cu 0, Euclid a demonstrat c cel mai mare divizor comun al numerelor a i b este r n, adic ultimul rest nenul din irul de mpriri succesive. n concluzie, trebuie realizat un proces de calcul (i, implicit un algoritm) pentru a executa operaiile din irul de mpriri succesive. Procesul se va termina n momentul n care restul unei mpriri din irul de mai sus este 0. irul mpririlor de mai sus este corect doar n cazul n care a i b au acelai semn (amndou numerele sunt pozitive sau negative n acelai timp). n caz contrar, trebuie s considerm valoarea absolut a acestora, rezultatul final fiind acelai. b) Mulimea variabilelor (V) Deoarece resturile mpririlor intermediare (de la prima pn la penultima) nu mai sunt folosite n alte scopuri, mulimea variabilelor utilizate n procesul de calcul este format doar din variabilele a, b i o variabil auxiliar r, care, la fiecare pas, va conine restul mpririi lui a la b. c) Procesul de calcul (P) i reprezentarea algoritmului innd seama c nu este necesar stocarea valorilor intermediare ale resturilor, rolul variabilelor a i b se va schimba la executarea fiecrei mpriri din irul mpririlor succesive. Procesul de mprire se repet pn cnd r devine 0. Se poate observa c valoarea ctului nu intervine n dinamica procesului de calcul. n continuare prezentm algoritmul de rezolvare a problemei: Algorithm EUCLID_1; Integer a,b,r; begin read a,b; repeat r a mod b; a b; // mprtiorul devine demprit b r; // restul devine mprtior until r = 0; write "Cel mai mare divizor comun: " , a; end Folosind doar dou variabile a i b (care, iniial vor stoca valorile datelor de intrare), se poate concepe un alt proces de calcul prin nlocuirea mpririlor succesive cu scderi repetate (operaia de mprire fiind, de fapt, un ir de scderi repetate), obinndu-se algoritmul lui Nicomachus. Algorithm EUCLID_2; Integer a,b; begin

read a,b; repeat if a > b then a a - b; else b b - a; until a = b; write "c.m.m.d.c.=" , a; end

REFERAT INFORMATICA

CEL MAI MARE DIVIZOR COMUN