Documente Academic
Documente Profesional
Documente Cultură
Prin numr prim, nelegem orice numr natural care se mparte doar
la unu sau la el nsui; se consider c 2 este cel mai mic numr prim.
Algoritmul de verificare dac un numr natural n este prim const n
generarea tuturor numerelor naturale mai mari sau egale cu 2 i mai mici
sau egale cu sqrt(n) i verficarea, pentru fiecare numr generat, dac l
divide pe n. Dac exista cel puin un astfel de numr, numarul n nu este
prim.
Se va folosi o variabil x, care va avea valoarea 1 dac numrul este
prim i 0 dac numrul nu este prim. Se presupune c numrul este prim
(variabila x se iniializeaz cu valoare 1) i, pentru primul numr gsit n irul
de numere generate care l divide pe n, se va schimba valoarea variabilei x
n 0 (numrul nu mai este considerat prim).
Pentru generarea irului de numere se folosete o variabil contor i
care va fi inializat cu valoarea 2 i care se va incrementa cu 1 pn va
avea valoareea [sqrt(n)].
ntreg n,i,x;
Varianta optimizat
nceput
citete n; x1;
Se vor elimina numerele
i2;
pare din irul generat, deoarece
dac n mod 2 = 0
ct timp i<=sqrt(n) and x = 1 execut
dac numrul n nu se divide prin
atunci x0;
dac n mod i = 0
2, atunci nu se va divide prin nici
altfel i3;
atunci x0;
Verificm dac
are divizori
un nnumr
par.
altfel ii+1 ;
sfrit_dac;
sfrit_ct_timp;
2
dac x = 1
atunci scrie Numrul este prim;
altfel scrie Numrul nu este prim;
sfrit_dac;
sfrit.
ntreg n,i;
nceput
citete n;
dac n mod 2 = 0
atunci in;
altfel i3;
ct timp i<=sqrt(n) execut
dac n mod i = 0
atunci in;
altfel ii+2;
sfrit_dac;
sfrit_ct_timp;
sfrit_dac;
dac i<>n
atunci scrie Numrul este prim;
altfel scrie Numrul nu este prim;
sfrit_dac;
sfrit.
Problema 1
# include <iostream.h>
# include <math.h>
int main ()
{int x,i,k,prim,a,b;
cout<<"x="; cin>>x;
while (x<=2)
{cout<<"x="; cin>>x;}
k=x; prim=0; //Aflam cel mai mare numar prim mai mic decat
numarul dat
while (prim==0)
{ k=k-1;
prim=1;
for (i=2;i<=sqrt(k);i++)
if (k%i==0) prim=0;
}
a=k;
k=x; prim=0; //Aflam cel mai mic numar prim mai mic decat
numarul dat
while (prim==0)
{k=k+1; prim=1;
for (i=2;i<=sqrt(k);i++)
if (k%i==0) prim=0;
}
b=k;
cout<<a<<"<"<<x<<"<"<<b;
Problema 2
Se consider urmtorul ir de numere naturale:
7,17,37,47,67,97,107,137,157,167,
Deducei regula dup care sunt generai termenii irului i
afiai pe ecran al N-lea (N<2012) termen din irul de mai sus.
Exemplu: N=10
157
Rspuns: irul este format din numere prime care au ultima cifr
egal cu 7.
Problema 3
S se afieze descompunerea unui numr natural par n, strict
mai mare dect 6,ntr-o sum de dou numere prime (verificarea
ipotezei lui Goldbach)
Analiza problemei
Se vor genera numerele prime k din intervalul [3, n/2] i se va
testa dac n-k este numr prim. Se vor afia perechile (k, n-k).
#include<iostream.h>
#include<math.h>
int main()
{ int n,k,i,OK;
cout <<"n= ";cin >> n; //citim numarul care e obligatoriu par>6
for(k=3; k<=n/2; k+=2)
{OK = 1;
// Se testeaz dac numarul k este prim
if(k%2 == 0) OK = 0;
else
for(i=3;i<=int(sqrt(k));i+=2)
{ if(k%i == 0) OK = 0; }
if(OK)
// k este prim si se testeaz dac numarul n-k este
prim
if((n-k)%2 == 0) OK = 0;
else
for(i=3;i<=int(sqrt(n-k));i+=2)
{if((n-k)%i == 0) OK = 0; }
if(OK)
//si numarul n-k este prim
cout<<k<<" "<<n-k<<endl;
}
return 0;
}
Bibliografie
Internet