Sunteți pe pagina 1din 11

Profesor ndrumtor:

Insp. Istrate Nicolae

Elev: Vasile Livia


Clasa: a IX-a B

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.

Se poate optimiza n continuare


algoritmul renunnd la variabila x,
prin testarea valorii lui i.
In cazul n care numrul nu mai e
considerat prim, i va lua valoarea n (o
valoare n afara irului de valori
generate!)

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

Se citete de la tastatur un numr natural x mai mare dect 2.


S se gseasc a i b, numere prime, astfel nct a<x<b, ar
diferena b-a este minim.
Analiza problemei
Vom cuta printre numerele mai mici dect x cel mai mare
numr prim i printre numerele mai mari dect x cel mai mic numr
prim.

# 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.

Se vor genera termenii irului considerndu-se doar numerele impare.


# include <iostream.h>
# include <math.h>
int main ()
{ int n, i, j, prim;
cout<<"n="; cin>>n;
// Se citeste numarul de valori
i=3; prim=1; // Valoarea initial a variabilei prim este 1
while (n>0)
{ prim=1;
// Se testeaz dac numerele generate sunt prime
for (j=2;j<=int(sqrt(i));j++)
{ if (i%j==0)
prim=0; }
if ((prim==1)&&((i%10)!=7))
// Se testeaz dac numerele prime
au ultima cifra 7
prim=0;
if (prim==1)
n=n-1; // Pentru fiecare termen generat, valoarea lui n se decrementeaz.
i=i+2; }
// Al N-lea termen se obtine cnd n ia valoarea 0.
cout<<i-2;
return 0;
}

n 1742, matematicianul Christian Goldbach, ntr-o scrisoare trimis


marelui matematician al vremii Leonard Euler (1707 1783), i propune
problema s arate c orice numr par > 6 este suma a dou numere prime.
De exemplu: 12 = 5 +7, 18 = 5 + 13 = 7 + 11; .

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

Miloescu, Mariana Informatic. Manual pentru clasa a IX-a,


Editura Didactic i pedagogic, R.A., 2004

Lica, Dana; Paoi, Mircea Informatic. Fundamentele


programrii. Culegere de probleme pentru clasa a IX-a, Editura L&S
Soft, Bucureti, 2005

Internet

S-ar putea să vă placă și