Sunteți pe pagina 1din 5

Algoritmul lui Euclid

Proiect realizat de Neagu Andreea

Acest algoritm este o metoda eficienta


pentru a calcula cel mai mare divizor comun
(cmmdc) a doua numere, CMMDC a doua
numere este cel mai mare numar care divide
(sau imparte exact) ambele numere. De
exemplu, cmmdc dintre 210 si 189 este 21.
In programare, acest algoritm se foloseste
de doua metode diferite: prima metoda este
efectuarea unor scaderi repetate, iar cea
de a doua metoda se foloseste de impartiri
repetate, de-asemenea, eu prefer metoda
anterior mentionata datorita simplitatii cu
care poate fi scrisa. Daca tot am adus vorba
de programare, trebuie mentionat faptul ca
acest algoritm nu este foarte eficient atunci
cand calculam cmmdc-ul a doua numere ce
apartim sirului lui Fibonacci.
Iar acum, vom explica ceea ce se intampla in
timpul algoritmului. Prima data, cred ca este
destul de clar ca acest algoritm se repeta
pana in momentul cand cele doua numere
sunt egale, deci putem spune ca avem
while(a != b). Apoi, algoritmul continua cu
verificarea celui mai mare numar, si scaderea
din acesta, a celui de-al doilea numar, asa ca
vom scrie.. Iar la final, rezultatul este stocat
in a (sau b, deoarece sunt egale), si il vom
afisa.
int a, b;
cin >> a;
cin >> b;

while(a != b)
{
if(a > b)
a = a - b;
if(b > a)
b = b - a;
}

cout << a;

Din cate ati vazut, algoritmul se repeta in


destul de multi pasi, asa ca vom intervenii cu
cea de a doua metoda: metoda prin impartiri
repetate.
Explicatia este asemanatoare cu cea a primei
metode: algoritmul se repeta pana in
momentul in care cel de-al doilea numar
devine 0 (deci avem, while (b != 0) ), iar
primul numar va prelua valoarea celui de-al
doilea numar, iar cel de-al doilea numar va
lua valoarea restului impartirii dintre a si b.
int a, b, r;
cin >> a;
cin >> b;
while(b != 0)
{
r = a % b;
a = b;
b = r;
}
cout<< a;

Iar metoda recursiva (ce deriva din cea de a


doua metoda), care ne scuteste de multe
randuri in plus, este sa scriem o functie de tip
int si sa ne folosim de recursivitatea.

int GCD(int A, int B)


{
if(!B)
return A;
return GCD(B, A%B);
}
Probleme in C++

1. Se dau două numere naturale


nenule a și b. Să se determine dacă cele
două numere sunt prime între ele. Două
numere se numesc prime între ele,
coprime sau relativ prime dacă singurul
lor divizor comun este 11.

Testăm pur și simplu


dacă CMMDC(a,b)=1.  Ca să aibă un
divizor comun p, trebuie ca diferența lor
să fie divizibilă cu p. Cum diferența
dintre a și b este 11, singura valoare
posibilă a lui p este 11.

bool relativePrimes(int a, int b) {


return gcd(a, b) == 1;
}
2. Se dau două fracții a/b și c/d. Știind
că a, b, c și d sunt numere naturale,
iar b și d sunt nenule, să se afișeze suma
celor două fracții sub forma unei fracții
ireductibile e/f.
a c ad +cb
+ =
b d bd

int e = a * d + c * b;
int f = c * d;
int g = gcd(e, f);
cout << e / g << " / " << f / g << '\n';

int gcdAB = gcd(a, b); a /= gcdAB; b /= gcdAB;


int gcdCD = gcd(c, d); c /= gcdCD; d /= gcdCD;
int lcmBD = lcm(b, d);
a *= lcmBD / b;
c *= lcmBD / d;
int e = a + c;
int f = lcmBD;
int gcdEF = gcd(e, f);
e /= gcdEF;
f /= gcdEF;
cout << e << " / " << f << '\n';

S-ar putea să vă placă și