Prima varianta cu while:

Cod:

#include <iostream>
using namespace std;
int main()
{
int n,ok=0,i;
cout<<"Ce numar vrei sa verifici daca este prim sau nu?";cin>>n;

i=2;
while(i<=n/2 && ok==0)
{
    if(n%i==0)
        ok=1;
    i=i+1;
}
if(ok==0)
    cout<<"TRUE - E prim";
else
    cout<<"FALSE - Nu e prim";
}



A doua varianta cu for:



Cod:

#include <iostream>
using namespace std;
int main()
{
int n,ok=0,i;
cout<<"Ce numar vrei sa verifici daca este prim sau nu?";cin>>n;

for (i=2;i<=n/2;i++)
{
    if(n%i==0)
        ok=1;

}
if(ok==0)
cout<<"TRUE - E prim";
else
    cout<<"FALSE - Nu e prim";

}



Explicatie pt while:
 int n,ok=0,i; // Ne trebuie un i care va lua valoarea divizorilor lui n pana la n/2 deoarece de la jumatate in colo nu are rost;
// Ne trebuie ok ca sa stim cand am ajuns unde am vrut si sa oprim while ul sa nu faca pasi in plus.
// Acel ok in while este pentru eficienta, deoarece el cand da peste un divizor al lui n se opreste efectiv while-ul.
 i=2; Initializam i care va lua divizori de la 2 ca de la 1 nu are rost ca 1 se imparte oricum cu oricine.
 while(i<=n/2 && ok==0) Cat timp nu am ajuns la jumatatea lui n si nu amgasit un divizor al lui n while ul tot cauta.
 if(n%i==0) Daca n se imparte exact la i(acesta creste de la 2 pana la jumtatea lui n) atunci insemana ca am gasit un divizor, iar numerele prime nu au divizori, doar pe 1 si ei insisi.
 ok=1 Daca nu am folosi ok cred ca ar fi imposibil de demonstrat algoritmul pt nr prime.
 i=i+1; Crestem i cu o unitate, ca altfel while ul ala nu se opreste, tot testeaza 2<=n/2 si tot asa pana la infinit.
 if(ok==0) Testam daca  NU am gasit divizor al lui n, daca NU am gasit inseamna ca numarul n este prim.
Daca am gasit un divizor al lui n si ok a devenit 0 inseamna ca acel numar are divizori si nu ne intereseaza.



Explicatie pt for:
SAME SHIT CA SI SUS DAR:

 for (i=2;i<=n/2;i++) Pentru i care pleaca de la 2 pana la jumtatea lui n, i creste cu 1


UN EXEMPLU PENTRU ALGORITMUL NOSTRU CU WHILE:

Numarul citit ca si N este 7 :

Se intra cu n = 7
ok=0, i=2, testeaza daca 2<=3(adevarat) si daca ok==0(adevarat)

Deci intra in while si avem: daca 7 impartit la 2 da rest 0 atunci ok devine 1.  Ceea ce la noi nu se intampla, astfel iese din if si face i=i+1
ok=0,i=3, testeaza daca 3<=3(adevarat) si daca ok==0(adevarat)
Deci intra in while si avem: daca 7 impartit la 3 da rest 0 atunci ok devine 1. Ceea ce la noi nu se intampla, astfel iese din if si face i=i+1
ok=0,i=4, testeaza daca 4<=3(fals) si daca ok==0(adevarat), fals cu adevarat da fals, astfel evita ramura de while SI AVEM:
testeaza daca ok a ramas 0, la noi chiar asa a ramas deci intra pe ramura "TRUE - E prim".




Numarul citit ca si N este 9 :

Se intra cu n = 9
ok=0, i=2, testeaza daca 2<=4(adevarat) si daca ok==0(adevarat)

Deci intra in while si avem: daca 9 impartit la 2 da rest 0 atunci ok devine 1.  Ceea ce la noi nu se intampla, astfel iese din if si face i=i+1
ok=0,i=3, testeaza daca 3<=4(adevarat) si daca ok==0(adevarat)
Deci intra in while si avem: daca 9 impartit la 3 da rest 0 atunci ok devine 1. Ceea ce la noi se intampla si face ok=1, dupa face i=i+1

ok=1,i=4, testeaza daca 4<=4(adevarat) si daca ok==0(fals), adevarat cu fals da fals, astfel evita ramura de while SI AVEM:
testeaza daca ok a ramas 0, la noi nu a ramas, deoarece a gasit un numar care se imparte exact la jumatatea lui 9, astfel programul nostru se duce pe ramura de else, si intra pe ramura "FALSE - Nu e prim".