Noţiuni teoretice. Prin număr prim se înţelege orice număr natural mai mare sau
egal cu 2 care are exact doi divizori. Cum orice număr natural are ca divizori pe 1 şi pe el
însuşi, se poate afirma că numerele prime sunt numerele naturale care au ca divizori numai
pe 1 şi pe el însuşi.
Conform definiţiei, numărul 2 este considerat număr prim, fiind singurul număr prim
par. Se poate demonstra că dacă un număr natural n nu are divizori în intervalul [2; n ] ,
atunci el este număr prim.
Pornind de la descompunerile în factori primi, pot fi evaluaţi c.m.m.d.c. a două
numere naturale, reţinând termenii comuni la puterea cea mai mare, respectiv c.m.m.m.c.,
format cu termenii comuni şi necomuni la puterea cea mai mică.
În practică, pentru calculul c.m.m.d.c. se utilizează algoritmul lui Euclid. Conform
acestuia, se împarte primul număr la al doilea, apoi împărţitorul şi restul de la pasul curent
devin deîmpărţit şi împărţitor pentru pasul următor. Procedeul se repetă pană la obţinerea
ultimului rest nenul, care este de fapt valoarea c.m.m.d.c.
Exerciţiul 1. Să se scrie o funcţie care să afişeze toţi divizorii unui număr natural
citit de la tastatură.
#include<stdio.h>
#include<conio.h>
main(){
int a,i;
printf(ʺIntroduceti numarul:ʺ);
scanf(ʺ%iʺ,&a);
if(!a)printf(ʺOrice numar este divizor al lui zeroʺ);
else
{printf(ʺDivizorii numarului %i sunt:\tʺ,a);
for(i=1;i<=a/2;i++)
if(!(a%i))printf(ʺ%i\tʺ,i);
printf(ʺ%iʺ,a);}
getch();}
fact_prim( a) := k←0
for i ∈ 2 .. a 2 2
fact_prim( 20) =
putere ← 0
5 1
while ¬mod( a , i)
2 2
putere ← putere + 1 fact_prim( 36) =
3 2
a
a←
i 2 2
if putere fact_prim( 700) = 5 2
m
k, 0
←i 7 1
m ← putere
k, 1
k←k+ 1
m
6. Algoritmi specifici numerelor prime 39
#include<stdio.h>
#include<conio.h>
main(){
int a,putere,i=2;
printf(ʺDati nr:ʺ);
scanf(ʺ%iʺ,&a);
while (i<=a)
{
putere=0;
while(!(a%i))
{a=a/i;
putere=putere+1;}
if(putere)
printf(ʺFactorul %i apare la puterea %i\nʺ,i,putere);
i++;
}
getch();}
prim( a) := 1 if a 2
otherwise
test ← 0
for i ∈ 2 .. a prim( 9) = 0
test ← 1 if ¬mod( a , i) prim( 2) = 1
break if test
prim( 7) = 1
¬test
40 6. Algoritmi specifici numerelor prime
#include<stdio.h>
#include<conio.h>
#include<math.h>
main(){
int a,i,test=0;
printf(ʺDati nr:ʺ);scanf(ʺ%iʺ,&a);
if((a==0)||(a==1)) test=1;
for(i=2;i<=sqrt(a)&&(!test);i++)
if(!(a%i)) test=1;
printf(ʺ%iʺ,!test);
getch();}
#include<stdio.h>
#include<conio.h>
#include<math.h>
main(){
int i=0,n,k=0,prim(int a);
printf(ʺCate numere doriti sa afisati?ʺ);
6. Algoritmi specifici numerelor prime 41
scanf(ʺ%iʺ,&n);
printf(ʺPrimele %i numere prime sunt:\tʺ,n);
while(k<n)
{if(prim(i))
{printf(ʺ%i\tʺ,i);
k++;}
i++;}
getch();}
Exerciţiul 5. Să se scrie o funcţie care să returneze cel mai mare divizor comun a
două numere.
Propunere de algoritm. Conform algoritmului lui Euclid, valoarea celui mai mare
divizor comun este dată de ultimul rest nenul al împărţirilor succesive având ca deîmpărţit şi
împărţitor împărţitorul, respectiv restul de la pasul precedent.
cmmdc( a , b ) := while 1
rest ← mod( a , b )
break if ¬rest
a←b cmmdc( 52, 13) = 13
b ← rest cmmdc( 24, 60) = 12
b
#include<stdio.h>
#include<conio.h>
main(){
int a,b,rest;
printf(ʺIntroduceti numerele:ʺ);
scanf(ʺ%i%iʺ,&a,&b);
printf(ʺC.m.m.d.c. al numerelor %i si %i este ʺ,a,b);
42 6. Algoritmi specifici numerelor prime
while (1)
{rest=(a%b);
if(!rest)break;
a=b;
b=rest;}
printf(ʺ%iʺ,b);
getch();}
Exerciţiul 6. Să se scrie o funcţie care să returneze cel mai mic multiplu comun a
două numere.
a⋅ b
cmmmc( a , b ) := cmmmc( 24, 60) = 120
cmmdc( a , b )
cmmmc( 52, 13) = 52
#include<stdio.h>
#include<conio.h>
main(){
int a,b,cmmdc(int a,int b);
printf(ʺIntroduceti numerele:ʺ);
scanf(ʺ%i%iʺ,&a,&b);
printf(ʺC.m.m.m.c. al numerelor %i si %i este %iʺ,a,b,a*b/cmmdc(a,b));
getch();}
Temă de lucru
1. Se citesc două numere naturale. Să se afişeze numerele prime cuprinse în intervalul
determinat de ele.
2. Să se afişeze numerele naturale mai mici decât un număr n dat care împărţite la 3
dau restul 2 şi împărţite la 5 dau restul 3.