Teorie
Numere și divizibilitate la atestatul de informatică
Operatorii % și /, extragerea cifrelor, numere prime, divizori, numere perfecte, palindroame și c.m.m.d.c. — cu problemele de atestat în care apar.
7
minute de citit
10
secțiuni
127
probleme rezolvate legate
Actualizat pe .
Pe această pagină
Este cel mai des întâlnit grup de subiecte la proba de programare: 12 din cele 40 de probleme din sesiunea Dolj 2026 se rezolvă cu ideile de mai jos, iar sesiunea Galați 2026 adaugă încă pe atâtea — lista completă, din ambele sesiuni, e la finalul paginii. Vestea bună e că aproape toate se sprijină pe două operații și pe trei tipare care se repetă.
Cele două operații de bază
Totul pleacă de aici. Pentru două numere întregi:
| Operație | Ce face | Exemplu |
|---|---|---|
a % b |
restul împărțirii lui a la b |
3815 % 10 → 5 |
a / b |
câtul împărțirii întregi (partea zecimală se pierde) | 3815 / 10 → 381 |
Atenție: în C++, / între două numere int dă împărțire întreagă. 7 / 2 este 3, nu 3.5.
Dacă unul dintre operanzi e real (7 / 2.0), rezultatul devine real — sursa clasică de erori.
Testul de divizibilitate
if (n % d == 0) // d il imparte exact pe nAceasta este singura condiție de care ai nevoie pentru divizori, numere prime, numere perfecte și c.m.m.d.c. Dacă restul e zero, împărțirea e exactă.
Extragerea cifrelor
Combinând cele două operații, „desfaci" un număr cifră cu cifră:
n % 10 // ultima cifra
n / 10 // numarul fara ultima cifraRepetând până când numărul ajunge 0, treci prin toate cifrele, de la dreapta spre stânga:
3815 → cifra 5, ramane 381
381 → cifra 1, ramane 38
38 → cifra 8, ramane 3
3 → cifra 3, ramane 0 ← stop
Aplicat direct la suma cifrelor și la produsul cifrelor.
Numere prime
Un număr este prim dacă are exact doi divizori: 1 și el însuși. 0 și 1 nu sunt prime.
bool estePrim(int n) {
if (n < 2) return false;
for (int d = 2; d * d <= n; d++)
if (n % d == 0) return false;
return true;
}De ce d * d <= n
Nu e nevoie să cauți divizori până la n, pentru că divizorii vin în perechi. Pentru n = 36:
1 × 36 6 × 6 ← mijlocul, adica radical din 36
2 × 18
3 × 12
4 × 9
Orice divizor mai mare decât √n are deja o pereche mai mică decât √n. Dacă n-ai găsit niciunul
până la √n, nu mai există niciunul nici după. Pentru n = 1.000.000 înseamnă 1000 de pași în loc
de un milion.
Se scrie d * d <= n, nu sqrt(n) — sqrt lucrează cu numere reale și poate da 5.999999 în loc
de 6, ratând ultimul divizor.
Divizori: numărare și sumă
Aceeași buclă, două rezultate diferite. Diferența stă în limita superioară:
// toti divizorii, inclusiv n
for (int d = 1; d <= n; d++)
if (n % d == 0) c++;
// doar divizorii proprii (fara n insusi)
for (int d = 1; d <= n / 2; d++)
if (n % d == 0) s += d;Niciun divizor propriu al lui n nu poate depăși n / 2 — de aceea a doua buclă se oprește acolo.
Confuzia între cele două limite e una dintre cele mai frecvente greșeli.
Exersează pe subiecte reale
Numere perfecte
Un număr este perfect dacă e egal cu suma divizorilor săi proprii. Primele două sunt 6
(1+2+3) și 28 (1+2+4+7+14).
bool estePerfect(int n) {
if (n < 2) return false;
int s = 0;
for (int d = 1; d <= n / 2; d++)
if (n % d == 0) s += d;
return s == n;
}Exersează pe subiecte reale
Numere palindrom
Un număr e palindrom dacă rămâne același citit invers: 8, 121, 3003.
bool estePalindrom(int n) {
int inversat = 0, copie = n;
while (copie != 0) {
inversat = inversat * 10 + copie % 10;
copie /= 10;
}
return inversat == n;
}Linia-cheie se citește: „împinge cifrele deja adunate cu o poziție la stânga, apoi pune ultima
cifră a lui copie pe locul rămas liber."
Se lucrează pe o copie, nu pe n — bucla consumă valoarea, iar la final ai nevoie de n intact
pentru comparație. Este greșeala numărul unu la această categorie.
Exersează pe subiecte reale
C.m.m.d.c. — algoritmul lui Euclid
int cmmdc(int x, int y) {
if (y == 0) return x;
return cmmdc(y, x % y);
}Ideea: c.m.m.d.c. al lui x și y este același cu cel al lui y și restul împărțirii lui x la
y. Dacă un număr îi împarte exact și pe x, și pe y, atunci împarte exact și restul.
cmmdc(48, 36) → 48 % 36 = 12 → cmmdc(36, 12)
cmmdc(36, 12) → 36 % 12 = 0 → cmmdc(12, 0)
cmmdc(12, 0) → return 12
Nu contează ordinea argumentelor: cmmdc(36, 48) face un pas în plus și ajunge la același lucru.
Pentru un vector întreg, se aplică în lanț, pentru că operația e asociativă:
d = cmmdc(d, x[i]) la fiecare pas, pornind de la d = x[0].
Exersează pe subiecte reale
Cele trei tipare care se repetă
Dacă reții un singur lucru din pagina asta, reține-l pe acesta. Problemele nu sunt rezolvări diferite, ci aceleași trei structuri combinate.
1. Funcție de test + buclă
Scrii o funcție care răspunde true/false pentru un element, apoi o apelezi pentru fiecare.
Funcționează identic la prime, perfecte, palindroame.
for (int i = 0; i < n; i++)
if (esteCeva(x[i])) { /* ... */ }2. Flag sau contor pentru cazul gol
Aproape toate enunțurile cer NU EXISTA când nu s-a găsit nimic. Nu poți ști asta decât după
ce ai parcurs tot:
bool gasit = false; // sau: int cate = 0;
for (...)
if (...) { cout << x[i] << " "; gasit = true; }
if (!gasit) cout << "NU EXISTA";Când enunțul cere câte sunt, contorul înlocuiește flagul — îți dă și răspunsul, și informația „există sau nu".
3. Rezultat parțial acumulat
Pornești de la primul element și îl combini pe rând cu următoarele: d = cmmdc(d, x[i]). Aceeași
structură funcționează la sumă, maxim sau c.m.m.m.c.
Greșeli care se repetă
for (d = 2; d <= n; d++)la verificarea primalității — cânddajunge lan, condiția e adevărată și funcția răspunde „nu e prim" pentru orice număr- Uitarea cazului
n < 2—1apare raportat ca prim d <= nîn loc ded <= n / 2la numere perfecte —nse adaugă la propria sumă- Modificarea lui
nfără copie la palindrom — la finalna devenit0 return 0în cazul de bază la produsul cifrelor — trebuie1, elementul neutru al înmulțirii- Neinițializarea acumulatorilor —
int s;fără= 0pornește de la o valoare oarecare
Mai departe
Unde exersezi mai departe
Divizibilitatea, cifrele și numerele prime apar în zeci de variante; viteza vine din volum, nu din teorie în plus.
Pentru asta, pbinfo.ro e cea mai bună resursă românească: peste 2500 de probleme de informatică cu evaluator automat, și o trimiți la testat direct din browser. E construită pentru olimpiadă și bacalaureat, deci se completează cu ce găsești aici — noi acoperim subiectele de atestat, cu rezolvări scrise.
Dacă partea care te încurcă nu e codul, ci matematica de dedesubt — ce înseamnă exact un divizor, de ce se oprește căutarea divizorilor la rădăcina pătrată, cum se descompune un număr în factori primi — atunci problema nu e de informatică și nu se rezolvă scriind mai mult cod. sorinborodi.ro adună teste și subiecte de matematică pentru clasele 5–8 și pentru Evaluarea Națională, organizate pe clase. Divizibilitatea, numerele prime și cmmdc-ul se învață acolo — noi doar le transformăm în algoritmi.
Toate problemele din această categorie
Fiecare are rezolvare completă în C++, explicată pas cu pas.
127Arată toate problemele rezolvateAscunde lista127 programare
- Cea mai lungă secvență de numere prime consecutive (subprogramul prim)
- Cea mai mare putere a lui k din descompunerea a două numere
- Cea mai mică cifră a unui număr și de câte ori apare
- Cel mai mare divizor comun a două numere, folosind o funcție recursivă
- Cel mai mare divizor comun al celor n numere citite
- Cel mai mare număr format cu cifrele pare ale lui n
- Cel mai mare număr format din cifrele dintr-un fișier
- Cel mai mare număr format din toate cifrele lui n
- Cel mai mare număr mai mic decât n divizibil cu produsul cifrelor sale nenule
- Cel mai mare număr perfect dintr-un fișier și prima lui poziție (subprogramul perfect)
- Cel mai mare palindrom de pe diagonalele matricei (oglindit și maxim)
- Cel mai mic element cu suma cifrelor impară și numărul lui de apariții
- Cel mai mic multiplu de k dintre două elemente consecutive, în fișier
- Cel mai mic număr format cu cifrele pare ale lui n
- Cel mai mic palindrom din vector și ultima poziție pe care apare
- Cel mai mic pătrat perfect dintr-un șir și numărul său de apariții
- Cel mai mic și cel mai mare divizor prim al unui număr
- Cele mai mari două numere perfecte dintr-un fișier
- Cele mai mici trei elemente care au exact d divizori
- Cifra care apare de cele mai multe ori într-un număr
- Cifrele care nu apar într-un fișier, afișate descrescător
- Cifrele care nu apar într-un șir de numere
- Cifrele distincte ale unui număr, în ordine descrescătoare
- Cmmdc și cmmmc pentru fiecare pereche de elemente vecine
- Cuvintele de lungime impară, afișate în ordinea inversă citirii
- Cuvintele palindrom dintr-un fișier
- Cuvântul cu cele mai multe majuscule dintr-un text
- Câte elemente sunt divizibile cu suma propriilor cifre
- Diferența dintre cea mai mare și cea mai mică cifră a unui număr
- Divizorii unui număr natural
- Două numere din cifrele pare și din cifrele impare ale lui n
- Elemente egale cu c.m.m.d.c. dintre suma liniei și produsul coloanei
- Elemente puternice — divizibile cu numărul lor de cifre
- Elementele cu aceeași ultimă cifră ca ultimul element
- Elementele oglindite — inversul lor apare și el în vector
- Elementele prime care au cifre distincte
- Elementele unui vector care au suma cifrelor număr prim
- Eliminarea aparițiilor cifrei maxime dintr-un număr
- Eliminarea coloanei cu k elemente formate doar din cifre impare
- Eliminarea primei și ultimei cifre a unui număr
- Eliminarea tuturor aparițiilor unei cifre dintr-un număr
- Factorialul cel mai apropiat de n
- Intercalarea cifrelor a două numere cu același număr de cifre
- Intercalarea unei mulțimi între două elemente consecutive ale alteia
- Interschimbarea a două cifre într-un număr
- Inversarea cifrelor, fără prima, la numerele cu peste 4 divizori (inversareCifre și nrDivizori)
- Matrice cu cifrele lui x pe diagonală, deasupra și sub ea
- Matrice cu numere prime pe contur și zero în interior
- Matrice cu ultima cifră a produsului indicilor
- Matrice formată din cifrele unui număr
- Matrice pătratică cu cifrele lui x pe linia k și pe coloana k
- Matricea în care fiecare element devine suma divizorilor săi proprii
- Media aritmetică a elementelor cu toate cifrele distincte
- Media numerelor prime din șirul lui Fibonacci aflate într-o matrice (fibo și divprim)
- Numere cu prima cifră pătrat perfect, ordonate descrescător (p_cifra recursiv și sortare)
- Numere cu suma cifrelor de pe poziții pare egală cu cea de pe poziții impare
- Numere divizibile cu 10 după eliminarea cifrelor impare
- Numerele cu cifre identice mai mici sau egale cu n, scrise în fișier
- Numerele cu tot atâtea cifre de 0 și de 1 în baza 2
- Numerele de cinci cifre cu condiții pe cifre — o problemă fără soluții
- Numerele de două cifre dintr-un fișier, distincte și în ordine crescătoare
- Numerele de patru cifre cu cel puțin două cifre egale cu k și suma cifrelor 12
- Numerele de patru cifre cu ultimele trei cifre în ordine crescătoare
- Numerele din intervalul (p, q) al căror oglindit este prim, scrise în fișier
- Numerele dintr-un șir care au exact 3 divizori
- Numerele dintr-un șir cu suma cifrelor mai mare decât 10
- Numerele divizibile cu cifra lor de control
- Numerele echilibrate dintr-un fișier, în ordinea inversă citirii
- Numerele impare rotunde matematic
- Numerele impare rotunde, cu cele două jumătăți identice
- Numerele palindrom cu exact k divizori dintr-un fișier
- Numerele palindrom situate după primul număr par
- Numerele pare dintre primul și ultimul număr prim
- Numerele pentru care pătratul inversului e egal cu inversul pătratului
- Numerele prime de trei cifre cu toate prefixele prime
- Numerele prime mai mici sau egale cu n
- Numerele puternice dintr-un interval — divizibile cu fiecare cifră
- Numerele speciale — suma cifrelor egală cu numărul de divizori
- Număr real scris ca raport de două numere naturale cu diferența minimă
- Numărul cu cei mai mulți divizori proprii (ultimul, la egalitate)
- Numărul cu cei mai puțini divizori primi dintr-un șir terminat cu 0
- Numărul de apariții al fiecărei cifre și cifra de control (subprogramul gaseste_cifra)
- Numărul din cifrele unui text: întâi impare crescător, apoi pare descrescător (cifra și numar)
- Numărul elementelor echilibrate dintr-un șir
- Numărul extrem cu același număr de cifre (subprogramul numar_cifre)
- Numărul format din prima cifră a fiecărui număr, în ordinea inversă citirii
- Numărul prim cu cele mai multe cifre pare dintr-o matrice (prim și contorizare recursiv)
- Ordonarea crescătoare după numărul de cifre, apoi după valoare
- Ordonarea descrescătoare după ultima cifră, apoi după valoare
- Palindromurile dintr-un interval și palindromul asociat unui număr (subprogramul oglinda)
- Perechi consecutive de numere neprime, dar prime între ele (subprogramele nr_prim și cmmdc)
- Perechi de vecini cu aceeași sumă a cifrelor
- Perechi de vecini în care primul e mai mic decât suma cifrelor celui de-al doilea
- Perechile de numere palindromice mai mici sau egale cu n
- Prima cifră a fiecărui număr dintr-un șir
- Primele k numere dintr-un fișier, afișate în ordine crescătoare
- Primele n numere fsprime
- Primele n numere naturale cu suma cifrelor primă
- Primele n perechi de numere gemene
- Primii m multipli comuni a două numere
- Produsul cifrelor unui număr, folosind o funcție recursivă
- Produsul divizorilor primi ai unui număr
- Reuniunea a două mulțimi de numere naturale
- Rădăcinile pătratelor de numere prime dintr-un șir terminat cu 1 (subprogramul nr_div)
- Sortarea numerelor crescător după suma cifrelor
- Sortarea numerelor după cifra de control
- Suma cifrelor fiecărui număr dintr-un fișier
- Suma cifrelor unui număr, folosind o funcție recursivă
- Suma cuvintelor care pot fi convertite în numere
- Suma fracțiilor ireductibile (struct fractie: cmmdc și suma)
- Suma maximă a cifrelor pare dintr-un șir de numere (subprogramul cifre_pare)
- Suma numerelor mai mici sau egale cu n care au cifrele strict crescătoare
- Să se afişeze două numere naturale prime a căror sumă este numărul n
- Să se afişeze numerele perfecte din vector
- Să se afişeze numărul elementelor care sunt numere palindrom
- Să se afişeze numărul valorilor prime din vector
- Să se afişeze toate numerele mai mici sau egale cu n, care au exact 3 divizori
- Să se afişeze toate numerele prime din intervalul închis [a,b]
- Să se calculeze şi să se afişeze cel mai mare divizor comun al elementelor vectorului
- Să se verifice dacă numărul este perfect şi în caz afirmativ să se afişeze mesajul DA
- Să se verifice dacă numărul este prim
- Vectorul sumelor cifrelor elementelor
- Verifică dacă cifrele unui număr formează o progresie aritmetică
- Verifică dacă un număr este superprim
- Înjumătățirea numerelor cu toate cifrele pare (subprogramele verif și modif)
- Ștergerea din vector a numerelor cu cifre de aceeași paritate (sterge și cif)
- Ștergerea semnelor de punctuație și înlocuirea spațiilor cu asterisc
Alte pagini de teorie