You are on page 1of 4

Clasa a IX-a A, E

Cel mai mare divizor comun a dou numere (cmmdc)

1. Prezentare general
CMMDC al dou numere a i b este cel mai mare numr care le divide pe ambele. Exemplu:
dac a=30 i b=105, atunci cmmdc(a, b)=15 (3, 5, 15 sunt divizori comuni pentru a i b, dar
pe noi ne intereseaz cel mai mare, adic 15).
La matematic ai nvat un algoritm pentru determinarea cmmdc:
Se descompun numerele n factori primi;
Se aleg factorii primi comuni (o singur dat fiecare), cu exponentul cel mai mic i se
nmulesc ntre ei.
1 1 1 1 1 1
Exemplu: a=30 =2 * 3 * 5 , b=105 = 3 * 5 * 7 , factorii comuni la puterea cea mai
1 1
mic sunt 3 i 5 , nmulindu-i obinem 15.
La informatic nu vom folosi acest algoritm, deoarece ar fi destul de dificil de
implementat. n schimb exist doi algoritmi simpli pentru calculul cmmdc: algoritmul lui
Euclid i algoritmul lui Nicomahus.

2. Algoritmul lui Euclid (metoda impririlor succesive)


Atribuie lui b restul mpririi lui a la b, iar lui a vechea valoare a lui b. Rezolvarea
problemei se bazeaz pe condiia ca, b sa fie diferit de 0.
Pai algoritmului sunt:
P1. Se mparte a la b si se obine restul r (r=a % b).
P2. Se executa operaiile de atribuire a=b; b=r.
P3. Daca b!= 0, atunci se revine la pasul 1, ; altfel, cmmmdc =a

#include<iostream>

#include<fstream>

using namespace std;

int a,b,r;

ifstream f(cmmdc.in); //fisier de intrare din care citim a si b

ofstream g(cmmdc.out); //fisier de iesire in care afisam cmmdc


int main()
{

f>>a;//citim din fisier valoarea lui a


f>>b; //citim din fisier valoarea lui b
while(b!=0)
{

r=a%b;//calculez restul
a=b;//deimpartitul devine impartitorul
b=r;//impartitorul devine restul
}
g<<a;//afisam in fisierul de iesire cmmdc

return 0;
}

1
Clasa a IX-a A, E

2. Algoritmul lui NICOMAHUS (metoda scderilor repetate)


Ct timp numerele sunt diferite din numrul mai mare se scade numrul mai mic. n
momentul n care valorile devin egale, valoarea respectiv reprezint cmmdc.
Pai algoritmului sunt:
P1. Se scade din numarul mai mare celalalt numar : daca a>b, se
executa operatia a=a-b; altfel, se executa b=b-a.
P2. Daca a!=b , atunci se revine pasul 1, altfel c.m.m.d. =a .

#include<iostream>

#include<fstream>

using namespace std;

int a,b;

ifstream f(cmmdc.in); //fisier de intrare din care citim a si b

ofstream g(cmmdc.out); //fisier de iesire in care afisam cmmdc


int main()
{

f>>a;//citim din fisier valoarea lui a f>>b;


//citim din fisier valoarea lui b while(a!=b)
//cat timp numerele nu sunt egale
{
if(a>b) //verific care numar este mai mare
a = a-b;//scad din numarul mai mare numarul mai
mic else//altfel
b=b-a;
}
g<<a;//afisam in fisierul de iesire cmmdc
return 0;
}

4. Aplicaii

4.1. Se citesc dou valori naturale a i b. S se calculeze i s se afieze cel mai mic multiplu
comun al lui a i b. Cel mai mic multiplu comun a dou numere a i b este cel mai mic numr
nenul care se mparte exact la a i la b.

Exemplu: dac se citesc valorile a=30 i b=105 se va afia 210.

Rezolvare: Ne putem folosi de formula CMMMC = a*b/CMMDC(a,b). Dar n aceast


formul trebuie folosite valorile iniiale pentru a i b. Dac aplicm algoritmii anteriori
valorile iniiale pentru a i b se pierd. Ce este de fcut? S pstrm valorile lui a i b n dou
variabile auxiliare (spre exemplu x i y).

2
Clasa a IX-a A, E

#include<iostream>
#include<fstream>

using namespace std;

int a,b,r,cmmmc;

int x,y; //doua variabile auxiliare in care pastrez valorile lui a si b

f(cmmmc.in); //fisier de intrare din care citim a si b

g(cmmmc.out); //fisier de iesire in care afisam cmmdc


int main()
{

;//citim din fisier valoarea lui a


; //citim din fisier valoarea lui b

x=a; //retinem valoarea initiala a lui a

y=b; //retinem valoarea initiala a lui b

//aplicam algoritmul lui Euclid pentru calculul


cmmdc while(b!=0)
{

//calcule pentru cmmdc

cmmmc = x * y /a; //calculam cmmmc pe baza formulei


;//afisam in fisierul de iesire cmmmc

return 0;
}

4.2. Din fiierul ireductibil.in se citesc dou valori naturale a i b, reprezentnd numrtorul
i numitorul unei fracii. S se aduc fracia la forma ireductibil i s se afieze n fiierul
ireductibil.out numrtorul i numitorul acesteia separate prin semnul /.

Exemplu: dac a=105 i b=30 se va afia 7/2.

Rezolvare: Pentru a aduce fracia a/b la forma ireductibil va trebui s determinm


cmmdc(a,b) i s mprim att numrtorul, ct i numitorul cu aceast valoare. Dar, i n
acest caz trebuie s avem n vedere faptul c la calculul cmmdc(a,b) valorile iniiale pentru a
i b se pierd.

#include<fstream>

using namespace std;

int a,b,r;

int x,y; //doua variabile auxiliare in care pastrez valorile lui a si b

f(ireductibil.in); //fisier de intrare din care citim a si b

g(ireductibil.out); //fisier de iesire in care afisam cmmdc

int main()

3
Clasa a IX-a A, E

;//citim din fisier valoarea lui a

; //citim din fisier valoarea lui b

x=...............; //retinem valoarea initiala a lui a

y=...............; //retinem valoarea initiala a lui b

//aplicam algoritmul lui Euclid pentru calculul cmmdc


while(b!=0)
{
//calcule pentru cmmdc
}
x = x/a; //calculez numaratorul fractiei ireductibile
y = ............; //calculez numitorul fractiei ireductibile

g<<x<</<<y; //afisam in fisierul de iesire


//fractia
return 0;