You are on page 1of 5

Clasa a IX A,E

Determinarea numerelor prime

1. Prezentare general
Un numr prim este un numr natural care are exact doi divizori: numrul 1 i numrul n
sine. Dac lum n considerare numai divizorii proprii (adic cei diferii de 1 i numrul
nsui), un numr prim nu are niciun divizor propriu. Cel mai mic numr prim este 2, n
afar de 2 toate numerele prime sunt numere impare: 2, 3, 5, 7, 11, 13, 17, 19, .
O prim metod de a gsi dac un numr este prim se bazeaz pe observaia de mai sus.
Numrm divizorii proprii ai numrului n i dac acesta are 0 divizori proprii, numrul este
prim.
#include <iostream>
using namespace std;
int n, nr, d;//nr retine numarul de divizori ai lui n
int main()
{
cout<<n=; cin>>n;//citim numarul
nr = 0;//initial numarul n are 0 divizori, adica numararea divizorilor incepe de la 0
for(d=2;d<=n/2;d++) // generam valorile de la 2 la n/2 adica valori intre care pot fi
divizori {
if(n % d == 0) //daca d este divisor a lui n
{
nr++;//creste numarul de divizori
}//sfarsit if
}//sfarsit for
if (nr==0) //daca numarul are 0 divizori proprii
cout<<"Prim"; //afisam mesajul
else //in caz contrar
cout<<"Compus"; //numerele care nu sunt prime se numesc compuse
return 0;
}

O a doua metod mai eficient const n cutarea divizorilor ntre 2 i , deoarece


tim de la matematic faptul c un numr dac nu are divizori proprii pn la rdcina sa
ptrat va fi numr prim. Vom folosi o variabil prim cu urmtoarea semnificaie:

n momentul n care am gsit un divizor propriu nu mai are rost s cutm ceilali
divizori, deoarece este evident c numrul nu va fi prim. n final vom testa valoarea variabilei
prim.

1
Clasa a IX A,E

#include <iostream>
using namespace std;
int n, prim, d;
int main()
{
cout<<n=; cin>>n;//citim numarul
prim=1; //presupunem ca numarul este prim
d=2; //incepem cu cel mai mic divizor propriu

while (d*d<=n && prim==1) //cat timp nu am ajuns la si numarul este prim
{
if (n%d==0) //daca d este divizor, adica restul impartirii lui n la d este 0
prim=0; //numarul nu mai este prim, deoarece am gasit un divizor
d=d+1; // trecem la urmatoarea valoare
} //sfarsit while
if (prim==1) //daca prim este 1, adica daca numarul nu are
//divizori
cout<<"Prim";
else //in caz contrar
cout<<"Compus";
return 0;
}

2.1. Se citete un numr natural n (n>=2). S se afieze toate numerele prime mai mici sau
egale cu n. Exemplu: dac pentru n se citete valoarea n = 20 se va afia 2, 3, 5, 7, 11, 13 17,
19.

Rezolvare i explicaie:

Pentru a gsi numerele prime mai mici dect n, vom generare numerele pn la acea n i
verificm primalitatea fiecrui numr. Dac este prim atunci va fi afiat pe ecran. Cum tim
c singurul numr prim par este 2, vom afia aceast valoare i vom genera doar numerele
impare mai mici dect n.

Vom folosi urmtoarele variabile ntregi:

n valoarea pn la care trebuie s afim numerele prime;


nr un numr care ia pe rnd toate valorile de la 3 la n;
d o variabil pentru posibilii divizori
prim cu semnificaia din problema anterioar

2
Clasa a IX A,E

#include <iostream>
using namespace std;
int n, nr, prim, d;
int main()
{
//citim numarul n
cout << 2 << ' '; //afisam singurul numar par prim urmat e un spatiu
for(nr = 3; nr <= n; nr=nr + 2)//generam numerele impare incepand cu3
{
//vom verifica daca nr este prim si in caz afirmativ il vom afisa
.//presupunem ca numarul este prim
d =.;// incepem cu cel mai mic divizor propriu
while () //cat timp nu am ajuns la si numarul este prim
{
. //daca d este divizor, adica restul impartirii lui nr la d este 0
prim=.; //numarul nu mai este prim, deoarece am gasit un divizor
d=..; // trecem la urmatoarea valoare pentru d
} //sfarsit while
if (.) //daca nr este prim
cout<<nr <<" ";//afisam nr urmat de un spatiu
}//sfarsit for
return 0;
}

2.2. Se citesc dou numere naturale a i b (a<=b). S se afieze toate numerele prime
cuprinse ntre a i b. Exemplu: dac se citesc valorile a=10 i b=30 se vor afia numerele 11,
13, 17, 19, 23, 29.

Explicaie: ne vom baza pe programul anterioar, doar c n acest caz valoarea lui n va
parcurge valorile de la a la b (nu de la 1 la n).

. //biblioteci, namespace, declaratii


int main()
{
//citim numarul a
//citim numarul b

3
Clasa a IX A,E

for(nr = ..; nr <= ..; nr++)//generam numerele de la a la b


{
//vom verifica daca nr este prim si in caz afirmativ il vom afisa
//instructiuni pentru a verifica daca nr este prim
if (.) //daca nr este prim
cout<<nr <<" ";//afisam nr urmat de un spatiu
}//sfarsit for
return 0;
}
2.3. Se citete un numr natural n. Care este cel mai mic numr prim strict mai mare dect n?
Exemplu: dac n=20, cel mai mic numr prim mai mare dect 20 este 23.
Explicaie: s exemplificm pentru n=20. Cum procedm? Lum urmtoarea valoare dup n,
adic n+1. n exemplul nostru 21. Verificm dac- numrul este prim. n caz afirmativ
algoritmul se ncheie i se afieaz valoarea gsit. n caz contrar se trece la urmtoarea
valoare. n exemplul nostru trecem la 22. Verificm dac numrul e prim. Cum nu e prim
trecem la urmtoarea valoare 23. Aceast valoare este un numr prim, aa c ne oprim i o
afim. Prin urmare vom repeta atta timp ct numrul nu este prim incrementarea numrului
i verificarea primalitii acestuia.
. //biblioteci, namespace, declaratii
int main()
{
//citim numarul n
nr = n; //incepem de la valoarea lui n
do //repeta
{
nr = nr +1; //trecem la urmatorul numar
..//verificam daca nr este prim dar nu afisam nimic
} //sfarsit do while
while(prim==0); //pana cand numarul nu e prim
cout<<nr; // cel mai mic numr prim strict mai mare dect
n return 0;
}

2.4. Se citesc dou numere naturale a i b (a<=b). S se afieze cte numerele prime exist
ntre a i b. Exemplu: dac se citesc valorile a=10 i b=30 se va afia 6 (sunt 6 numere prime
ntre 10 i 30, respectiv numerele 11, 13, 17, 19, 23, 29).

4
Clasa a IX A,E

Explicaie: ne vom baza pe algoritmul de la problema 2.2., doar c n acest caz nu trebuie s
afim numerele prime, ci s le numrm. Vom folosi o variabil k,care s numere valorile
prime. Vom genera cu ajutorul variabilei nr numerele de la a la b i dac nr este prim
valoarea variabilei k crete cu 1. Desigur numrarea valorilor prime ncepe de la valoarea 0,
ceea ce nseamn c valoarea iniial a lui k este 0. n final se afieaz k.

. //biblioteci, namespace, declaratii


int main()
{
//citim numarul a
//citim numarul b
k =. //valoare initiala a lui k, citeste explicatia de mai sus
for(nr = ..; nr <= ..; nr++)//generam numerele de la a la b
{
//vom verifica daca nr este prim
//instructiuni pentru a verifica daca nr este prim
if (.) //daca nr este prim
.;//valoarea lui k creste cu 1
}//sfarsit for
cout<<;//afisam cate numere prime sunt intre a si b
return 0;
}
2.5. Se citete un numr natural n. Care este cel mai mare numr prim strict mai mic dect n?
Exemplu: dac n=20, cel mai mare numr prim mai mic dect 20 este 17. Dac n=47, cel
mai mare numr prim mai mic dect 47 este 43.
Explicaie: ne bazm pe algoritmul de la problema 2.3., dar atenie ce operaie trebuie fcut
cu valoare lui nr.