Pe scurt
Un număr prim este un întreg mai mare decât 1 cu exact doi divizori pozitivi: 1 și numărul însuși. Echivalent, nu are divizori proprii, adică divizori strict între 1 și . 2, 3, 5 și 7 sunt prime; 1 nu este prim, iar 9 este compus deoarece . Pentru testare, este suficient să cauți un divizor până la : dacă are un divizor mai mare, partenerul său este mai mic.
În Python, pentru 7 testezi restul împărțirii la 2 și 3; niciunul nu este zero, deci 7 este prim. Numărul 9 are rest zero la împărțirea la 3.
În detaliu
Un număr este prim dacă nu are divizori proprii. Dacă cu , atunci , deci . Un număr compus are așadar un divizor propriu mai mic sau egal cu și testarea se oprește la . Numerele 0 și 1 și cele negative nu sunt prime, iar 2 este singurul număr prim par.
Exemplul 1 — testul de primalitate. Pentru se testează , adică valorile cu : niciun nu divide 97 (resturile la 2, 3, 5 și 7 sunt 1, 1, 2 și 6), deci 97 este prim. Pentru primul care divide este 7, pentru că ; bucla se poate opri aici.
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
bool prim = n >= 2;
for (int d = 2; prim && d <= n / d; ++d)
if (n % d == 0)
prim = false;
cout << prim;
return 0;
}
Pentru intrările 97, 91, 2 și 1 programul afișează 1, 0, 1 și 0. Pentru condiția d <= n / d este falsă de la început și rezultatul rămâne adevărat.
Câștigul este mare: pentru numărul prim bucla face cel mult 31 621 de teste (valorile ), pe când o verificare a tuturor numerelor până la ar face aproape un miliard. Același test, aplicat fiecărui număr dintr-un interval și însoțit de un contor, numără numerele prime ale intervalului: în sunt șase, anume 11, 13, 17, 19, 23 și 29. Pentru fiecare dintre ele bucla se oprește la cel mult , pentru că și depășește 30.
Exemplul 2 — descompunerea în factori primi. Împarți la fiecare cât timp divide, pornind de la , și numeri câte împărțiri ai făcut: acesta este exponentul. Pentru se obține .
- : , exponent 3.
- : , exponent 2.
- : 5 nu se împarte la 4; , ciclul se oprește.
- Rămâne , deci 5 este un factor prim cu exponentul 1.
int n = 360;
for (int d = 2; d * d <= n; ++d) {
int e = 0;
while (n % d == 0) { n /= d; e++; }
if (e > 0) cout << d << '^' << e << ' ';
}
if (n > 1) cout << n << "^1";
Secvența afișează 2^3 3^2 5^1. Din exponenți rezultă numărul divizorilor: . Cel mai mare factor prim al lui 13195 se găsește tot așa: ; după eliminarea factorilor 5, 7 și 13 rămâne și bucla se oprește, deci răspunsul este 29. Divizorii compuși nu apar niciodată ca factori, pentru că factorii mici au fost deja eliminați.
Exemplul 3 — numărul de divizori, în perechi. Divizorii unui număr vin în perechi , iar pentru fiecare pereche este de ajuns să găsești divizorul mai mic, . Pentru perechile sunt , , și , iar valoarea dă , deci perechea se reduce la un singur divizor. Numărul de divizori este . Dacă pătratul perfect nu este tratat separat, divizorul 6 este numărat de două ori și se obține greșit 10.
int n = 36, k = 0;
for (int d = 1; d * d <= n; ++d)
if (n % d == 0)
k += (d * d == n) ? 1 : 2;
cout << k;
Secvența afișează 9. Același ciclu, pentru , găsește doar perechea și afișează 2, adică exact cei doi divizori ai unui număr prim. Un număr are un număr impar de divizori numai dacă este pătrat perfect.
Cazuri-limită ale testului de primalitate. Pentru condiția d <= n / d este adevărată la , iar , deci 4 este compus. Pentru condiția este falsă de la început, pentru că , iar 3 rămâne prim. Pentru pătratele numerelor prime, și , testul se oprește tocmai la divizorul , respectiv .
Pentru admitere
Separă proprietatea „este prim” de operația „găsește primul divizor”. Condiția de oprire trebuie să includă egalitatea: pentru pragul ajunge la și găsește factorul; cu numărul 49 ar fi declarat prim. Testarea lui 2 separat și apoi doar a numerelor impare înjumătățește munca. Nu înlocui condiția cu d <= sqrt(n) în aritmetică flotantă: pentru valori mari rotunjirea poate omite sau adăuga un candidat, pe când d * d <= n și d <= n / d lucrează numai cu întregi. Pentru a număra numerele prime dintr-un interval mare se folosește ciurul din lecția „Ciurul lui Eratostene”, nu testul separat al fiecărui număr. Complexitatea testului este proporțională cu . Atenție și la valorile mici: dacă lipsește verificarea , numerele 0 și 1 sunt declarate prime, pentru că bucla nu găsește niciun divizor.
Exemplu în formatul examenului. Ce se afișează în urma executării secvenței de mai jos?
int n = 84, k = 0;
for (int d = 2; d <= n; d++)
if (n % d == 0) {
k++;
while (n % d == 0)
n /= d;
}
cout << k;
- a) 2
- b) 3
- c) 4
- d) 12
Răspunsul corect este b). Pentru : 84 se împarte la 2 de două ori și , . Pentru : 21 se împarte la 3 o dată, , . Valorile nu divid 7. Pentru : , . Ciclul numără factorii primi distincți ai lui 84, adică 2, 3 și 7. Varianta d) este numărul tuturor divizorilor lui 84, , iar varianta c) numără factorii cu exponenții din adunați (4 = 2+1+1).
Al doilea exemplu — cel mai mic divizor. Ce se afișează pentru , respectiv pentru ?
int d = 2;
while (d * d <= n && n % d != 0)
d++;
cout << d;
Pentru : și , deci ; apoi , dar , iar ciclul se oprește. Se afișează 3, cel mai mic divizor mai mare decât 1. Pentru : trece prin 2, 3, 4 și ajunge la 5, unde oprește ciclul. Se afișează 5, care nu divide 17: rezultatul este un divizor numai dacă numărul nu este prim.
Greșeli frecvente
- Greșit: 1 este prim deoarece are doar un divizor.Corect: un număr prim are exact doi divizori pozitivi.
- Greșit: 2 este compus fiindcă este par.Corect: 2 este singurul număr prim par.
- Greșit: la 49 se pot testa doar divizorii mai mici decât 7.Corect: trebuie testat și 7.
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ă
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 (OMECI 5099/2009, anexa 5), CNCE; rocnee.eu
- Programa școlară de informatică, clasa a IX-a, matematică-informatică (OMEC 6930/2025, anexa 42), p. 1653–1654; 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
Desene: Redactare proprie (desen original), conform Programa școlară de informatică, clasa a IX-a (OMECI 5099/2009, anexa 5), CNCE; rocnee.eu
