Didaxis
lecție · Informatică

Algoritmul lui Euclid

Algoritmul lui Euclid calculează cel mai mare divizor comun a două numere naturale: cât timp al doilea număr nu este 0, înlocuiești perechea (a, b) cu (b, restul împărțirii lui a la b). Când restul devine 0, ultimul împărțitor este cmmdc. Varianta cu scăderi repetate scade numărul mai mic din cel mai mare până când devin egale.

Se face în:
Clasa a IX-a
Actualizat la: 30 octombrie 2026
1pe scurtstratul 1 din 3 · rezumatul lecției

Pe scurt

Cel mai mare divizor comun, prescurtat CMMDC, al două numere este cel mai mare număr care le divide pe amândouă. Algoritmul lui Euclid folosește faptul că pentru . Repetăm până când al doilea număr devine zero; primul este răspunsul.

În Python, 18 % 12 dă 6, apoi 12 % 6 dă 0; algoritmul lui Euclid se oprește cu CMMDC egal cu 6.

Desen la lecția „Algoritmul lui Euclid”
2în detaliustratul 2 din 3 · pentru clasă și Bacalaureat

În detaliu

Algoritmul lui Euclid pornește de la observația că pentru și că . Un divizor comun al lui și divide și restul , iar un divizor comun al lui și divide ; perechile au deci aceiași divizori comuni. Restul scade strict la fiecare pas, așa că algoritmul se oprește, iar numărul de împărțiri este cel mult proporțional cu numărul de cifre ale lui .

Exemplul 1 — . Se notează perechea după fiecare iterație.

  1. , deci perechea devine .
  2. , deci perechea devine .
  3. , deci perechea devine .
  4. Al doilea număr este 0, ciclul se oprește; rezultatul este primul număr, 6.
#include <iostream>
using namespace std;
int main() {
    int a = 48, b = 18;
    while (b != 0) {
        int rest = a % b;
        a = b;
        b = rest;
    }
    cout << a;
    return 0;
}

Programul afișează 6. Ordinea atribuirilor contează: dacă ai scrie întâi a = b, restul s-ar calcula cu valoarea nouă și rezultatul ar fi greșit.

Exemplul 2 — fracție ireductibilă. Fracția se simplifică prin . Pașii: , apoi , deci cmmdc este 42 și fracția devine . Două numere sunt prime între ele (coprime) dacă ; de exemplu pentru resturile sunt 14, 11, 3, 2, 1, 0, deci cmmdc este 1.

Exemplul 3 — o problemă cu răspuns prin cmmdc. Un dreptunghi de unități se acoperă exact cu pătrate egale, fără rest. Cea mai mare latură posibilă este divizor comun al lui 84 și 126, deci cmmdc, adică 42. Atunci încap pătrate pe lățime și pe lungime, în total pătrate. Orice latură mai mică, precum 21 sau 14, este tot un divizor comun și ar da mai multe pătrate: 24 în cazul laturii 21.

Câte împărțiri face algoritmul. Numărul de iterații crește cu logaritmul numerelor, nu cu valoarea lor. Cazul cel mai lung apare când împărțirile dau câturi 1, adică la termeni consecutivi ai șirului lui Fibonacci: pentru se fac nouă împărțiri, cu resturile 34, 21, 13, 8, 5, 3, 2, 1, 0, iar nicio pereche cu al doilea număr mai mic decât 55 nu cere mai mult de opt. De aceea, chiar pentru numere de ordinul , algoritmul face cel mult câteva sute de împărțiri.

Varianta prin scăderi folosește egalitatea pentru . Pentru se obțin perechile , , și ; ciclul se oprește când numerele sunt egale, iar rezultatul este 6. Varianta cu restul înlocuiește mai multe scăderi consecutive printr-o singură împărțire; pentru scăderile ar face un milion de pași, iar împărțirea unul singur.

Ideea. Dacă , cu restul , atunci și au exact aceiași divizori comuni ca și . De aceea poți înlocui perechea cu fără să schimbi cel mai mare divizor comun. Numerele scad la fiecare pas, așa că după câțiva pași restul devine 0. În acel moment perechea este , iar .

Varianta cu împărțiri, în pseudocod, cu convențiile din subiectele de Bacalaureat:

citește a, b (numere naturale)
┌cât timp b ≠ 0 execută
│  r ← a % b
│  a ← b
│  b ← r
└■
scrie a

Dacă la început , primul pas doar le interschimbă: pentru și , restul este 210, iar perechea devine . Dacă de la început, algoritmul afișează , ceea ce e corect, pentru că orice număr divide 0.

Varianta cu scăderi funcționează numai pentru numere nenule: dacă unul este 0, scăderea nu îl mai modifică pe celălalt, iar bucla nu se oprește. Cele două variante, pentru comparație:

Ce Pseudocod C++
cmmdc prin împărțiri repetate cât timp : ; ; ; rezultatul este while (b != 0) { r = a % b; a = b; b = r; }
cmmdc prin scăderi repetate () cât timp : dacă atunci , altfel while (a != b) if (a > b) a = a - b; else b = b - a;
cmmmc a / d * b
și prime între ele cmmdc(a, b) == 1
cmmdc pentru numere pentru fiecare citit d = cmmdc(d, x);

Varianta recursivă. Relația se scrie direct ca funcție recursivă:

int cmmdc(int a, int b) {
    if (b == 0)
        return a;
    return cmmdc(b, a % b);
}

De la cmmdc la cmmmc. Pentru numere nenule, . Calculul a * b / d poate depăși valoarea maximă a tipului int chiar când rezultatul încape, de aceea împarți întâi: a / d * b.

În Python (clasa a IX-a, programa nouă). Programa nouă de clasa a IX-a cere ambele variante ale algoritmului, scrise în Python. Varianta cu împărțiri arată așa:

def cmmdc(a, b):
    while b != 0:
        a, b = b, a % b
    return a

print(cmmdc(588, 210))
42

Exemple suplimentare

Exemplul 4 — cel mai mic multiplu comun. Din relația rezultă . Două lumini clipesc la 48 și la 18 de secunde; ele clipesc din nou împreună după 144 de secunde. În program se calculează a / d * b, nu a * b / d: pentru și produsul este 9 999 900 000 și depășește valoarea maximă a tipului int, 2 147 483 647.

Exemple rezolvate

Exemplul 1: urmărirea împărțirilor. Calculează cu varianta cu împărțiri și scrie valorile lui , și la fiecare pas.

  1. , deci , iar perechea devine .
  2. , deci , iar perechea devine .
  3. , deci , iar perechea devine . Bucla se oprește.
#include <iostream>
using namespace std;

int main() {
    int a, b, r;
    cin >> a >> b;
    while (b != 0) {
        r = a % b;
        cout << a << " " << b << " " << r << "\n";
        a = b;
        b = r;
    }
    cout << "cmmdc = " << a << "\n";
    return 0;
}

Pentru intrarea 588 210, programul afișează:

588 210 168
210 168 42
168 42 0
cmmdc = 42

Verificare: și , deci .

Exemplul 2: aceleași numere, prin scăderi. Câte scăderi face varianta cu scăderi pentru 588 și 210?

  1. Perechile sunt: (378, 210), (168, 210), (168, 42), (126, 42), (84, 42), (42, 42).
  2. Sunt 6 scăderi, față de 3 împărțiri. Primele două scăderi țin locul împărțirii , iar ultimele trei, al împărțirii .
#include <iostream>
using namespace std;

int main() {
    int a, b, pasi = 0;
    cin >> a >> b;            // a, b nenule
    while (a != b) {
        if (a > b)
            a = a - b;
        else
            b = b - a;
        pasi++;
    }
    cout << a << " " << pasi << "\n";
    return 0;
}

Pentru intrarea 588 210, programul afișează:

42 6

Exemplul 3: cmmmc. Calculează .

  1. și , deci .
  2. .
#include <iostream>
using namespace std;

int cmmdc(int a, int b) {
    while (b != 0) {
        int r = a % b;
        a = b;
        b = r;
    }
    return a;
}

int main() {
    int a, b;
    cin >> a >> b;
    cout << a / cmmdc(a, b) * b << "\n";
    return 0;
}

Pentru intrarea 84 126, programul afișează:

252

Exemplul 4: simplificarea unei fracții. Se citesc numărătorul și numitorul unei fracții, numere naturale nenule. Afișează fracția ireductibilă egală cu ea. Pentru : , deci fracția devine .

#include <iostream>
using namespace std;

int main() {
    int a, b;
    cin >> a >> b;
    int x = a, y = b;
    while (y != 0) {          // cmmdc pe copii, ca a si b sa ramana neschimbate
        int r = x % y;
        x = y;
        y = r;
    }
    cout << a / x << "/" << b / x << "\n";
    return 0;
}

Pentru intrarea 1350 2025, programul afișează:

2/3

Exemplul 5: nivel de examen, perechi de numere prime între ele. Scrie subprogramul prime, care primește prin parametrii și două numere naturale nenule și returnează 1 dacă ele sunt prime între ele, sau 0 altfel. Folosește-l ca să afli câte perechi , cu , sunt formate din numere prime între ele.

  1. Două numere sunt prime între ele dacă cmmdc lor este 1, deci subprogramul calculează cmmdc cu algoritmul lui Euclid și compară rezultatul cu 1.
  2. Programul parcurge toate perechile cu și le numără pe cele pentru care subprogramul returnează 1.
#include <iostream>
using namespace std;

int prime(int a, int b) {
    while (b != 0) {
        int r = a % b;
        a = b;
        b = r;
    }
    return a == 1;
}

int main() {
    int nr = 0;
    for (int x = 1; x <= 30; x++)
        for (int y = x + 1; y <= 30; y++)
            if (prime(x, y))
                nr++;
    cout << nr << "\n";
    return 0;
}

Programul afișează:

277

Subprogramul lucrează pe copiile parametrilor (transmiși prin valoare), așa că x și y din main nu se modifică.

3pentru admiterestratul 3 din 3 · pentru examene

Pentru admitere

La urmărirea fragmentelor, notează perechea după fiecare iterație, nu doar restul. Expresia a % b nu se evaluează pentru b = 0. Algoritmul poate fi cerut și ca test de coprimalitate sau ca număr de iterații. Dacă ordinea numerelor este inversată, de exemplu , prima iterație doar le schimbă între ele: , perechea devine și se continuă ca mai sus. Variabila k din secvențele de examen numără iterațiile, nu resturile nenule: numărul ei este cu unul mai mare decât numărul resturilor nenule, pentru că ultima iterație produce restul 0. Când apar trei numere, cmmdc se aplică de două ori: .

Exemplu în formatul examenului. Ce se afișează în urma executării secvenței de mai jos?

int a = 84, b = 36, k = 0;
while (b != 0) {
    int r = a % b;
    a = b;
    b = r;
    k++;
}
cout << a << ' ' << k;
  • a) 12 2
  • b) 12 3
  • c) 6 2
  • d) 36 1

Răspunsul corect este a). Prima iterație: , perechea devine și . A doua: , perechea devine și . Ciclul se oprește cu și se afișează valoarea lui , adică 12, urmată de numărul de iterații, 2. Varianta d) apare dacă se oprește ciclul după prima iterație.

Al doilea exemplu în formatul examenului. Varianta recursivă a algoritmului. Ce se afișează?

int f(int a, int b) {
    return b == 0 ? a : f(b, a % b);
}
cout << f(35, 15) << ' ' << f(15, 35);

Răspunsul este 5 5. Apelul f(35, 15) ajunge la f(15, 5), apoi la f(5, 0), care întoarce 5. Apelul f(15, 35) calculează și devine f(35, 15), adică același lanț; ordinea argumentelor schimbă numărul de apeluri, nu rezultatul. Primul apel face trei apeluri în total, iar al doilea patru, deoarece primul pas doar inversează argumentele.

Unde apare la examen

La Bacalaureatul la informatică, matematică-informatică, programa de examen numește explicit algoritmul lui Euclid, la „Algoritmi elementari”, alături de divizibilitate și numerele prime (anexa 2 la OMECTS 4800/2010). Algoritmul poate apărea în pseudocod la Subiectul al II-lea, unde se cer valoarea afișată, date de intrare și un algoritm echivalent, sau într-un subprogram cerut la Subiectul al III-lea, care este formatul probei din iunie–iulie 2026. Formatul descris este cel din 2026; potrivit proiectului de ordin pentru Bacalaureatul 2027, programa rămâne aceeași.

Pe programa școlară veche, determinarea cmmdc și a cmmmc este la clasa a IX-a, la prelucrarea numerelor (OMECI 5099/2009); programa nouă de clasa a IX-a cere explicit algoritmul lui Euclid cu scăderi repetate și cu împărțiri repetate (OMEC 6930/2025, anexa 42).

Greșeli frecvente

  • Greșit: rezultatul este ultimul rest zero.
    Corect: este ultimul rest nenul, aflat în a; la final b este 0, deci afișarea lui b în loc de a este greșită.
  • Greșit: se poate calcula a % b după ce b a devenit zero.
    Corect: bucla se oprește înainte.
  • Greșit: CMMDC al lui 48 și 18 este 12.
    Corect: este 6.
  • Greșit: varianta cu scăderi merge și pentru un număr egal cu 0.
    Corect: dacă și , bucla while (a != b) scade la nesfârșit 0 din , fără să îl schimbe; varianta cu scăderi se folosește numai pentru numere nenule, iar cea cu împărțiri tratează corect și cazul .
  • Greșit: ordinea atribuirilor nu contează.
    Corect: scrierea a = b; b = a % b; calculează restul cu valoarea nouă a lui a, adică ; restul trebuie salvat înainte, într-o variabilă r.
  • Greșit: algoritmul poate modifica liber valorile citite.
    Corect: algoritmul modifică a și b; dacă îți mai trebuie după aceea (de exemplu, la simplificarea fracției sau la cmmmc), lucrezi pe copii sau într-un subprogram cu parametri transmiși prin valoare.
  • Greșit: a * b / d este un calcul sigur al cmmmc.
    Corect: poate depăși tipul int; scrie a / d * b sau folosește long long.
în contul tăuPremium

Testează-te pe această lecție

Lecția o citești aici, fără cont. Testele pe lecții și capitole sunt în cont, cu grile originale Didaxis și explicația fiecăreia: gratuit 10 grile pe zi, fără limită cu Premium, 49 de lei pe lună pentru fiecare copil.

Înainte și după

Întrebări frecvente

De ce funcționează algoritmul lui Euclid?
Pentru că a și b au aceiași divizori comuni ca b și restul împărțirii lui a la b: din a = b · q + r rezultă că orice divizor comun al lui a și b îl divide și pe r, și invers. Perechea scade la fiecare pas, iar cmmdc rămâne același, până când restul devine 0.
Ce variantă a algoritmului lui Euclid este mai rapidă?
Varianta cu împărțiri. Un singur pas cu rest face cât mai multe scăderi la rând: pentru 1000000 și 1, varianta cu scăderi face 999999 de pași, iar cea cu împărțiri unul singur.
Cum calculez cel mai mic multiplu comun în C++?
Cu formula cmmmc(a, b) = a · b / cmmdc(a, b). Ca să nu depășești tipul int, împarți întâi: a / cmmdc(a, b) * b.

Surse și referințe

Redactare proprie, conform programei:

  • OMEC 6930/2025, MO 4 bis/2026, Informatică CS, p. 1632–1633 și 1653–1654; OMEC 4370/2026, anexa 8, p. 155–156; rocnee.eu
  • OMEC 4370/2026, anexa 8, Informatică IX intensiv, p. 155–156
  • OMEC 6930/2025, MO 4 bis/2026, Informatică CS, p. 1632–1633; rocnee.eu
  • OMEC 6930/2025, anexa 66, Informatică IX CS militar, Monitorul Oficial nr. 4 bis/8.01.2026, pp. 2563–2578; cdn.edupedu.ro; centralizator oficial actualizat prin OMEC 3224/2026, legislatie.just.ro
  • OMEC 6930/2025, MO 4 bis/2026, Informatică CS, p. 1653–1654; rocnee.eu
  • UNSTPB, Regulament admitere licență 2026, Anexa II-1.2 p. Anx II-14 și Anexa XI-3 p. Anx XI-6–7 (PDF p. 64, 120–121); admitere.pub.ro
  • OMECTS 4800/2010, anexa 2, Informatică, p. 3 și 6; aplicabilitatea 2027: OMEC 5211/2026, art. 3 alin. (10); edu.ro
  • OMECTS 4800/2010, anexa 2, Informatică, p. 3–4; edu.ro
  • OMECTS 4800/2010, anexa 2, Informatică, p. 5–6; edu.ro

Documente consultate

  • UNSTPB, admitere 2026, anexa XI-3, p. Anx XI-6–7
  • Programa școlară de informatică, clasa a IX-a, matematică-informatică (OMEC 6930/2025, anexa 42), p. 1653–1654; rocnee.eu
  • Programa școlară de informatică, clasa a IX-a (OMECI 5099/2009, anexa 5), CNCE; rocnee.eu
  • Programa de bacalaureat la informatică, matematică-informatică (anexa 2 la OMECTS 4800/2010), Ministerul Educației, p. 3 și 6; edu.ro
  • Subiectele și baremele Bacalaureatului 2026; subiecte2026.edu.ro
  • Proiect de ordin privind organizarea și desfășurarea Bacalaureatului, calendar 2027, Ministerul Educației; edu.ro

Desene: Redactare proprie (desen original)

lecțiile sunt gratuite

Ai citit lecția. Acum verifică-te.