
Verificare număr prim în C++ (Clasa a IX-a)
Dându-se un număr natural n
, să se determine dacă este sau nu prim.
Exemplu. Pentru n = 3
, răspunsul va fi DA
, pe când pentru n = 10
,
răspunsul va fi NU
.
Ce este un număr prim?
Un număr prim este un număr natural care are exact doi divizori: 1
și el
însuși.
Câteva curiozități
Numărul 1
nu este prim, deoarece are un singur divizor.
Cel mai mic număr prim este 2
. Acesta este singurul număr par și prim.
Determinarea primalității unui număr (metoda naivă)
Un număr prim are exact doi divizori, iar toți divizorii unui număr n
se
găsesc între 1
și n
. Așadar, o primă metodă de rezolvare ar fi să
verificăm, pentru toate numerele de la 1
la n
, dacă se găsește vreun număr
care să fie divizor al lui n
:
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int numarDivizori = 0;
for(int d = 1; d <= n; d++) {
if(n % d == 0) {
numarDivizori++;
}
}
if(numarDivizori == 2) {
cout << "DA";
} else {
cout << "NU";
}
return 0;
}
Această problemă merge, dar nu este destul de eficientă. Pentru un număr mai
mare, spre exemplu 1.000.000.000
(un miliard), s-ar efectua un miliard de
operații, un număr imens.
Determinarea primalității unui număr (metoda optimizată 1)
Observăm următorul lucru: divizorii vin în perechi. Astfel, pentru un divizor
d
al lui n
, cu d < sqrt(n)
, există un alt divizor, d' = n / d
, cu
proprietatea că d * d' = n
și d' > sqrt(n)
. Prin urmare, putem să
parcurgem divizorii doar până la radical, reducând semnificativ numărul de
operații efectuate.
Observație. Majoritatea numerelor au un număr par de divizori (din acest
motiv vin în perechi). Excepție fac numerele pătrate perfecte — acestea au
divizor și pe sqrt(n)
, care este perechea sa (și care nu trebuie numărată de
două ori! — evităm asta prin a verifica dacă n / d == d
).
Pentru radical, putem folosi biblioteca <cmath>
sau să mergem până când d * d ≤ n
.
Implementare C++
Algoritmul este următorul:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int n;
cin >> n;
int radical = sqrt(n), numarDivizori = 0;
for(int d = 1; d <= radical; d++) {
if(n % d == 0) { //Am găsit divizorul d, dar considerăm și perechea acestuia
int dprim = n / d; //d' = n / d
if(dprim != d) {
numarDivizori += 2;
} else { //Dacă d' == d, atunci perechea lui d este el însuși, deci îl numărăm doar o dată
numarDivizori++;
}
}
}
if(numarDivizori == 2) {
cout << "DA";
} else {
cout << "NU";
}
return 0;
}
Determinarea primalității unui număr (metoda optimizată 2)
O metodă și mai optimizată este următoarea:
- verificăm dacă
n
este par; dacă este șin ≠ 2
, atunci nu mai are rost să verificăm divizorii acestuia, deoarece clar nu va fi prim; dacăn
este chiar2
, atunci afișăm că este prim; - luăm doar divizorii impari până la
sqrt(n)
;n
fiind impar, nu mai trebuie să verificăm dacă se împarte la numere pare.
Implementare C++
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
if(n == 2) { //Caz particular: n este 2
cout << "DA";
} else if(n < 2) { //Caz particular: n < 2 (nu va fi prim)
cout << "NU";
} else if(n % 2 == 0) { //n este > 2. Dacă este par, atunci nu poate fi prim
cout << "NU";
} else {
int gasitDivizori = 0;
for(int d = 3; d * d <= n; d += 2) { //Luăm divizori impari: 3, 5, 7, …
if(n % d == 0) { //Am găsit un divizor diferit de 1 și de n, deci n nu este prim
gasitDivizori = 1;
break;
}
}
if(gasitDivizori == 1) { //Dacă am găsit divizori diferiți de 1 și de n, atunci nu este prim
cout << "NU";
} else { //În sfârșit!!! n e prim 🤑
cout << "DA";
}
}
return 0;
}
Verifică instant dacă un număr este prim în C++
Mai ții minte Ciurul lui Eratostene? Este o lecție predată la matematică în
clasa a șasea, prin care puteam să determinăm foarte ușor pentru primele n
numere naturale, care sunt prime.
Ideea este următoarea: știm că 2
este prim, așadar toți multiplii lui 2
(4, 6, 8, …
) nu sunt primi — îi marcăm într-un vector. Mergem la următorul
număr nemarcat, 3
. Asumăm astfel că este prim, așadar multiplii săi îi
marcăm (6, 9, 12, …
). Mergem la următorul număr nemarcat, 5
. Repetăm
procedeul și observăm faptul că numerele nemarcate sunt cele prime.
Pentru tot codul complet și explicații amănunțite, vă recomandăm acest articol de la 100din100.
Problemă propusă
Alte resurse și bibliografie
DS
Autorul acestei lecții
Dominic Satnoianu
Această lecție a fost redactată de către Dominic Satnoianu.
© 2021 – 2025 Aspire Education Labs SRL. Toate drepturile rezervate.
Așa cum este specificat și în termeni și condiții, conținutul acestei pagini este protejat de legea drepturilor de autor și este interzisă copierea sau modificarea acestuia fără acordul scris al autorilor.
Încălcarea drepturilor de autor este o infracțiune și se pedepsește conform legii.
Cuprinsul lecției
Ce este un număr prim?Câteva curiozitățiDeterminarea primalității unui număr (metoda naivă)Determinarea primalității unui număr (metoda optimizată 1)Implementare C++Determinarea primalității unui număr (metoda optimizată 2)Implementare C++Verifică instant dacă un număr este prim în C++Problemă propusăAlte resurse și bibliografieCreează-ți un cont InfoAs și primești…
- Acces la sute de lecții de calitate, cu animații și exerciții
- Acces la peste 800 de probleme de informatică
- Indicații și rezolvări pentru fiecare problemă
- Totul 100% gratuit!
Comentarii 0