Sunteți pe pagina 1din 18

Rezolvari atestat 2010

1.Se citesc de la tastatura n fractii in forma( numarator, numitor). Se cere sa se calculeze


suma acestor fractii (in forma ireductibila). Ex 7/6 + 1/3 +1/4 +2/5=43/20.

# include <iostream.h>
int cmmdc(int d, int i) // calculam cmmdc cu algoritmul lui euclid recursiv,i este
impartitorul iar d deimpartitul
{
if(i= =0) //daca impartitorul e nul se returneaza deimpartitul
return d;
else
return cmmdc(i,d%i); //deimp.devine impartitorul iar impartitorul devine restu
}
int cmmmc(int a,int b) //calculam cmmmc
{
return (a*b)/cmmdc(a,b);
}
void main( )
{
int a,b,c,d,n;
cout<<"n="; cin>>n; //citim nr de fractii
//citim prima fractie
cout<<"numarator 1: "; cin>>a;
cout<<"numitor 1: "; cin>>b;
for (int i=2;i<=n;i++)
{//citim pe rand incepand cu cea de a doua fractie
cout<<"numarator: "; cin>>c;
cout<<"numitor: "; cin>>d;
//calculam acum suma dintre primele fractii(aducem la numitor comun care este cmmmc
dintre numitorul b si d)
a=a*cmmmc(b,d)/b + c*cmmmc(b,d)/d; //imnultim primul numarator cu cmmmc
si al doilea tot cu cmmmc ca sa obtinem numaratorul fractiei suma rezultat din adunarea
primei fractii cu a doua
b=cmmmc(b,d); // numitorul noii fractii suma
}
// fractia sumacu numarator a si numitor b care se obtine o simplific astfel
for (d=2;d<=a/2;d++) // caut divizori pt numaratorul fractiei suma ce am obtinut-o
{
if (a%d= =0) // verific daca si numitorul b si numaratorul a se simplifica cu d
if (b%d= =0)
{
a=a/d; // impart numitorul si numaratorul cu divizorii lor
b=b/d;
}
}
cout<<a<<"/"<<b<<endl; //afisam matricea
}

2.Sa se scrie un program care calculeaza "cifra de control" a unui numar intreg efectuand

1
suma cifrelor sale, apoi suma cifrelor acestei sume etc. pana se obtine o suma formata
dintr-o singura cifra. ex: cifra de control a numarului 1971 este 9 (1971->18->9)

# include <iostream.h>
int sc(int x)
{ //calculam suma cifrelor
int s=0;
while (x!=0)
{ s=s+x%10;
x=x/10; }
return s;
}

void main()
{
int x,s;
cin>>x; // citim numarul
while(x>10) // cat timp numarul are cel putin 2 cifre ii tot calculam suma cifrelor
x=sc(x);
cout<<x<<endl;
getch();
}

3.Sa se scrie un program care determina primele n cifre din seria fractiei subunitare
k/m=0.c1c2...cn pentru k, m(k<m) si n numere naturale citite de la tastatura.
ex. pentru k=5, m=23 si n=5 se va afisa 0.21739

# include <iostream.h>
# include <iomanip.h>
void main()
{
int k,m,n;
//citim numaratorul k si numitorul m al fractiei k/m
cout<<”k=; cin>>k;
cout<<”m=; cin>>m;
cout<<”n=”;cin>>n; //citim numarul de cifre
cout<<setprecision(n)<<(float)k/m; //calculeaza cu virgula fractia k/m
//setprecision(n) calculeza numarul de cifre ale unui numar zecimal
}

4. Sa se afiseze toate numerele prime de trei cifre care citite invers sunt tot numere prime.
ex. 761 este prim si 167 este tot prim

# include <iostream.h>
# include <math.h>
int ogl(int x)
{ //calculam oglinditul
int o=0, c;
while(x!=0)
{

2
c= x%10
o=o*10+c;
x=x/10;
}
return o;
}
int nprim(int x)
{//testam daca un numar este prim
int prim=1,d;
for (d=2;d<=x/2;d++)
if (x %d==0)
prim=0;
return prim;
}
void main()
{
int x;
for(x=100;x<=999;x++) //parcurg numerele de 3 cifre
{
if(nprim(x)==1 && nprim(ogl(x))==1) // testam daca x si oglinditul lui sunt prime
cout<<x<<" ";
}
}

5. Se spune ca n este deosebit daca exista un numar natural m astfel incat n=m+S(m),
unde S(m) este suma cifrelor lui m.Sa se scrie un program care verifica daca un numar
natural n dat este deosebit. ex. 1235 este deosebit (1235=1225+10).

# include <iostream.h>
int sc(int x)
{ //calculam suma cifrelor
int s=0;
while (x!=0)
{ s=s+x%10;
x=x/10; }
return s;
}
void main()
{ int n;
cin>>n;
if(n-sc(n)>0) //verificam daca diferenta dintre numar si suma cifrelor sale e mai mare ca
0,atunci insemna ca am gasim un m=n-s(n)
cout<<"DA";
else
cout<<"NU";
}

6. O carte se pagineaza cu numere de la 1 la n (20<=n<=10000). Fiind dat n, sa se afle cate


cifre s-au folosit la paginare. ex.pentru o carte cu 100 de pagini se folosesc 192 cifre.

3
# include <iostream.h>
int v[10];
void main()
{
int i,s=0,n,aux,c;
cout<<"n=";
cin>>n;
for(i=1;i<=n;i++)
{
aux=i;
while(aux!=0)
{ c=aux%10;
v[c]=v[c]+1; //folosim un vector v in care retin numarul de aparitii ale cifrei pe
care am aflat-o(de exemplu daca c =9 ,v[c]=v[9] adica cati de 9 am gasit intre toate numerele
incepand cu prima pagina a cartii si pana la ultima
aux=aux/10;
}
}
for(i=0;i<=9;i++) //parcurgem toate cifrele de la 0 la 9 si calculam suma
s=s+v[i]; intre cate cifre de 0 am, de 1, etc pana la 9
cout<<s<<endl;
}

7.Sa se determine daca doua numere naturale date sunt termeni consecutivi ai sirului
lui Fibonacci. ex. 55 si 89 sunt termeni consecutivi in sirul Fibonacci.
# include <iostream.h>
int fibo(int a, int b)
{//calculam daca a si b sunt numere fibonacci,
if(a= =1 && b= =1) //daca nr sunt egale cu 1 atunci obtinem 1(adica sunt nr fibonacci)
return 1;
else
if(a>b) //daca a >b returneaza 0 (adica ca nu sunt nr fibonaccii) pt ca a
trebuie sa fie mai mic ca b
return 0;
else
return fibo(b-a,a); //ne tot face diferenta dintre ele ca sa le verifice daca sunt
fibonacci,pana cand ajunge si a si b sa fie egale cu 1
}
void main()
{
int a,b;
cin>>a>>b; //citim numerele
if(fibo(a,b)==1) //verific daca sunt numere fibonacci,adica se returneaza 1
cout<<"DA";
else
cout<<"NU";
}

8. Sa se scrie un program care determina toate reprezentarile posibile ale unui numar natural
ca suma de numere naturale consecutive.

4
ex. pentru n=50 avem 50=8+9+10+11 si 50=11+12+13+14.
# include <iostream.h>
# include <conio.h>
main()
{
int j,n,s,k;
cin>>n;
for(int i=1;i<=n/2;i++) //caut numere pana la jumatatea lui n care sa le pot aduna
cu alte numere consecutive ca sa obtin valoarea lui n
{
s=i; //consider ca initial suma este i
k=i+1; //trec la urmatorul element consecutiv
while(s<n) //cat timp suma este mai mica ca n
{ s=s+k; //tot adunam la suma numere consecutive k
k++;}
if(s= =n)
{
for(j=i;j<k;j++)
cout<<j<<"+"; //afisam toate numerele consecutive incepand de la val i
si pana la k-1 care adunate dau n
cout<<endl; // trec pe randul urmator si incep alta cautare de nr consecutive
}
}

9.Se numesc numere " super prime", acele numere ale caror prefixe sunt toate numere prime.
Sa se verifice daca un numar este "super prim " si sa se afiseze prefixele sale in acest caz.
ex.239 este "super prim" deoarece 2,23 si 239 sunt prime.
# include <iostream.h>
# include <math.h>
int prim(int x)
{//testam daca un numar este prim
int prim=1,d;
for (d=2;d<=x/2;d++)
if (x %d==0)
prim=0;
return prim;
}

}
void main()
{
int n,ok=1,aux; // ok il folosim ca si prim, adica sa vad daca e prim sau nu
cout<<"n="; cin>>n; //citesc n
aux=n; //il retin in aux pe n pt ca dupa ce parcurg while n ajunge 0
while(n!=0)
{
if(prim(n)==0) //verific daca n nu este prim
ok=0;

5
n=n/10; //tot elimin cate o cifra de la sfarsit ca sa obtin prefixele
}
if(ok= =1) //daca am obtinut toate prefixele prime
{
cout<<"da";
while(aux!=0) //afisez fiecare prefix (tot taind cate o cifra)
{
cout<<aux<<" ";
aux=aux/10;
}
}
else
cout<<"nu";
}

10. Se da n numar natural. Sa se afiseze cel mai apropiat numar prim fata de n. Programul va
contine cel putin un subprogram.

# include <iostream.h>
# include <math.h>
# include <conio.h>
int prim(int x)
{//testam daca un numar este prim
int prim=1,d;
for (d=2;d<=x/2;d++)
if (x %d==0)
prim=0;
return prim;
}

int nr(int n)
{//caut cele mai apropiate numere prime fata de n, adica a la stanga si b la dreapta
int a=n, b=n;
while(prim(a)==0) //atata timp cat a nu este prim sa tot cobor cu o unitate spre stanga
,se opreste cand a este prim
a--;
while(prim(b)==0) //atata timp cat b nu este prim sa tot urc cu o unitate spre dreapta,se
opreste cand b ii prim
b++;
if(n-a<=b-n) //daca diferenta dintre numar si nr din stanga lui e mai mica decat
diferenta dintre nr din dreapta si numarul dat, atunci il scriu pe cel din stanga, adica pe a, in
caz contrat il scriu pe b, pe cel din dreapta
return a;
else
return b;
}
void main()
{
int n;
cout<<"n="; cin>>n;

6
cout<<nr(n);
}

11. Sa se afiseze cate din elementele unui vector dat de numere naturale sunt numere
Fibonacci. ex. x=(5,10,1,7,9,8,1,6,55,19) sunt 5 numere Fibonacci

# include <iostream.h>
# include <conio.h>
int fibo(int x)
{//testeaza daca un numar este numar fibonaccii adica daca se obtine din suma a 2 nr
anterioare
int tv=1,tn=1,ok=0; //tv si tn sunt termenii fibonacii care ii adun ca sa obtin val.x
while(tn<x)
{
tn=tv+tn;
tv=tn-tv;
}
if(tn= =x) // daca il pot scrie pe x ca suna de tv si tn atunci nr e fibonacci si se
returneaza val. altfel 0
return 1;
else
return 0;
}
int main()
{
int x[30],n,cate=0;
//citim un vector si daca termenul citit este nr fibonacci il contorizez in cate
cin>>n;
for(int i=1;i<=n;i++)
{ cin>>x[i];
if(fibo(x[i]))
cate++;
}
cout<<cate;

12. Sa se verifice daca un vector dat este o multime( in sensul cunoscut din matematica), iar
daca nu este multime sa se transforme acest vector in multime.
ex: x=(5,10,1,7,9,8,1,6,55,19) nu este multime. se obtine prin transformare
x=(1,2,9,4,6,5,20,3)
//un vector e multime daca nu are 2 elemente egale,daca va avea elemente egale le vom sterge
pe cele egale, pastrand doar un element dintre cele egale
# include <iostream.h>
# include <conio.h>
void sterge(int x[],int &n,int k)
{//stergem elementele egale pastrand doar unu daca sunt mai multe egale
int i;

7
for(i=k;i<n;i++) // daca gasesc un element pe pozitia k egal cu elementul la care ma
aflu, atunci toate elementele aflate pe pozitiile k+1,…n vor fi mutate cu o pozitie spre stanga
si lungimea vectorului va scadea cu o unitate la fiecare stergere
x[i]=x[i+1];
n--;
}
int apare(int x[],int y,int k,int n)
{// vedem daca elementele incepand de la o pozitie k+1 se mai afla printre elementele
vectorului pana la pozitia k ,daca mai apare return 1 altfel 0
for(int i=k+1;i<=n;i++)
if(x[i]= =y)
return 1;
return 0;
}
int main()
{
int x[30],n,i,ok=1;
//citim vectorul
cout<<"n="; cin>>n;
for(i=1;i<=n;i++)
{ cout<<”x[”<<i<<”]=”;
cin>>x[i];}
for(i=1;i<=n;i++) // parcurgem din nou vectorul si
{
if(apare(x,x[i],i,n)) // daca x[i] mai apare printre elementele vectorului sa il sterg
{
sterge(x,n,i);
i--;
}
}
//afisam multimea
for(i=1;i<=n;i++)
cout<<x[i]<<" ";

13.Se citesc de la tastatura doi vectori cu elemente numere intregi de dimensiune n,


respectiv m. Sa se afiseze cate elemente din al doilea vector sunt strict mai mici decat
toate elementele din primul vector.
# include <iostream.h>
int min(int x[],int n)
{ //minumul dintr-un vector, tot compar minimul dintre elementele dinainte cu elementul la
care ma aflu
int m=x[1];
for(int i=2;i<=n;i++)
if(m>x[i])
m=x[i];
return m;
}

8
void main()
{
int x[30],y[30],m,n,mn,cate=0,i,j;
//citim primul vector
cout<<"n="; cin>>n;
for(int i=1;i<=n;i++)
{ cout<”x[”<<i<<”]=”
cin>>x[i];}
//citim cel de-al doilea vector
cout<<"m="; cin>>m;
for(j=1;j<=m;j++)
{cout<<”y[”<<j<<”]=”
cin>>y[j];}
mn=min(x,n); // lui mn ii atribui valoarea minimului vectorului x
for(j=1;j<=m;i++) // parcurg elementele vectorului y si vad cate sunt mai mici decat
cel mai mic numar din vectorul x
if(y[j]<mn)
cate++;
cout<<cate;
}

14.In fisierul "DATE.TXT" se gasesc doua numere mari( care pot avea mai mult de 10 cifre),
cate unul pe o linie.Sa se afiseze suma celor doua numere.
ex: "DATE.TXT" 45899200768797
50999867
se va afisa 45899251768664
# include <fstream.h>
# include <iomanip.h
# include <conio.h>
int x[20];
int main()
{ FILE *f; // declar fisierul
int t,s,lx=0;
long a,b,r;
f=fopen("date.txt",”r”); //deschid fisierul
//citesc a si b din fisierul notat cu f
f>>a;
f>>b;
while(a!=0 && b!=0) //cat timp nr sunt diferite de zero, procedez astfel:adun
numar cu numar incepand de la coada si numarul obtinut dupa adunare , stiu ca nu trebuie sa
depaseasca val.10, ce trece peste 10 il pastrez ca fiind restul nr obtinut impartit la 10 si daca
val a fost mai mare ca 10 impart valoarea care o am si catul obtinut il retin in t si il adun la
urmatoarele 2 numere care se aduna, deci lucru pe rand cu cifrele de la coada si dupa ce le-am
adunat le elimin pana cand a ajung sa am numai val.zero
{
r =a%10+b%10+t;
lx++
x[lx]=r%10; // in x[lx] retin suma obtinuta a celor 2 cifre adunate
t =(a%10+b%10)/10;
a=a/10;

9
b=b/10;
}
while(a>0)
{
r=a%10+t;
t=r%10;
lx++
x[lx]=r%10;
a=a/10;
}
while(b>0)
{
r=b%10+t;
t=r%10;
lx++
x[lx]=r%10;
b=b/10;
}
// acum afisam numerele obtinute de la coada spre inceput
for(int i=lx;i>=1;i--)
cout<<x[i];
getch();
return 1;
}

15. Se considera un vector cu n componente. Stiind ca el contine doua subsecvente de numere


ordonate crescator , sa se ordoneze intregul vector prin interclasarea celor doua subsecvente.
// vectorul initial este x, iar secventele sunt y si z
# include <iostream.h>
# include "functii.txt"
void interclasare(int r[],int &l,int x[],int lx,int y[],int ly) // r vectorul obtinut dupa interclasare
{ // algoritmul de interclasare dintre secventele x si y ,procedam astfel:parcurg in paralel cele
2 secvente si compar un element din x cu unu din y si care este cel mai mic va fi pus in r si
lung. lui r va creste
int i=1,j=1;
l=0;
while(i<=lx && j<=ly)
{
if(x[i]<=y[j])
{ l++;
r[l]=x[i++];}
else { l++;
r[l]=y[j++];
}
while(i<=lx)
{ l++;
r[l]=x[i++];}
while(j<=ly)
{ l++;

10
r[l]=y[j++];}
}
void main()
{
int x[30],n,l,i,r[30],y[30],ly=0,z[30],lz=0;
cin>>n;
//citim vectorul initial x
for (i=1;i<=n;i++)
cin>>x[i];
for(i=1;i<n;i++)
if(x[i]>x[i+1])
{ ly++;
y[ly]=x[i];}
for(int j=i+1;j<=n;j++)
{lz++;
z[lz]=x[j];}
}
else
{ ly++;
y[ly]=x[i];
}
//afisam secventa y
for (i=1;i<=ly;i++)
cout<<y[ly];
cout<<endl;
//afisam secventa z
for (i=1;i<=lz;i++)
cout<<z[lz];
cout<<endl;
//afisam vectorul r rezultat dupa interclasare
interclasare(r,l,y,ly,z,lz);
for (i=1;i<=l;i++)
cout<<r[l];
cout<<endl;
}

16. Se citeste de la tastatura un tablou unidimensional cu n elemente numere intregi. Sa se


afiseze elementul care apare de cele mai multe ori in tablou. Daca exista mai multe astfel de
elemente, se vor afisa toate.
Ex. Pentru n=8 si elementele (23,7,11,7,19,7,11,11) se vor afisa elementele 7 si 11, care apar
fiecare de cate 3 ori.

# include <iostream.h>
# include "functii.txt"
int apare(int x[],int n,int k)
{ // calculam de cate ori apare un numar k intr-un vector si returnam nr de aparitii
int ap=0;
for(int i=1;i<=n;i++)
if(x[i]= =k)

11
ap++;
return ap;
}
void sterge(int x[],int n,int k)
{ // stergem elementele egale cu elementul de pe pozitia i la care ne aflam si elementele aflate
pe pozitii de la i incolo vor fi mutate spre stanga cu cate o unitate la fiecare stergere , lung
vectorului scade la fiecare stergere
for(int i=1;i<=n;i++)
{
if(x[i]= =k)
{
for(int j=i;j<n;j++)
x[j]=x[j+1];
n--;
}
}
}
int max(int x[],int n)
{ //calculam maximul dintr-un vector tot comparand elem la care ma aflu cu maximul dinainte
int mx=x[1];
for(int i=2;i<=n;i++)
if(x[i]>mx)
mx=x[i];
return mx;
}
void main()
{
int x[50],j,n,ap[50],max,i;
//citim vectorul
cin>>n;
for (i=1;i<=n;i++)
cin>>x[i];
//vedem de cate ori apare un element x[i] in vector si nr de aparitii le retinem in vectorul ap
for(i=1;i<=n;i++)
ap[i]=apare(x,n,x[i]);
//parcurgem vectorul si daca numarul de aparitii al unui elem. este egal cu numarul maxim de
aparitii atunci afisam elementul si daca apare acel element de mai multe ori sa ii sterg din
vector celelalte aparitii
for(i=1;i<=n;i++)
if(max(ap,n)==ap[i])
{cout<<x[i]<<" ";
for(j=i;j<=n;j++)
{if(x[i]= =x[j])
{sterge(x,n,x[j]);
sterge(x,n,x[i]);
}
}
}
}

12
17. Fie v un vector de numere intregi. Sa se construiasca un vector w, astfel incat
w[i]=numarul de aparitii ale lui v[i] in vectorul v.Sa se afiseze cei doi vectori, fiecare pe o
linie.
Ex: pentru v=(1,5,2,1,5,7,2,1,5) se obtine w=(3,3,2,3,3,1,2,3,3)
# include <iostream.h>
# include "functii.txt"
int apare(int x[],int n,int k)
{ //calculam de cate ori apare un numar k intr-un vector si returnam nr de aparitii
int ap=0;
for(int i=1;i<=n;i++)
if(x[i]= =k)
ap++;
return ap;
}
void main()
{
int x[30],n,ap[30],i;
//citim vectorul
cin>>n;
for (i=1;i<=n;i++)
cin>>x[i];
//vedem de cate ori apare un element x[i] in vector si nr de aparitii le retinem in vectorul ap
for(i=1;i<=n;i++)
ap[i]=apare(x,n,x[i]);
cout<<"sirul dat: ";
for(i=1;i<=n;i++)
cout<<x[i];
cout<<endl;
cout<<"Sirul aparitiilor: ";
for(i=1;i<=n;i++)
cout<<ap[i];
cout<<endl;
}

18. Sa se construiasca o matrice A cu n linii si n coloane ce se completeaza cu termenii lui


Fibonacii.Completarea se va face pe linii . Nu se vor folosi structuri de date auxiliare.
Ex. Pentru n=3 se va afisa matricea
1 1 2
3 5 8
13 21 34.

# include <iostream.h>
# include "functii.txt"
int fibo(int k)
{ // functia care returneaza numarul lui fibonacci
int i, tn,tv;
tn=tv=1; // primii doi termeni sunt egali cu 1 si urmatorul se calculeaza din suma
celor doi dinaintea lui
i=1;

13
if(k= =1 || k= =2) //k il folosim ca sa stim la ce element ne aflam,pt primii 2 termeni
se returneaza 1 pt ca sunt ei egali cu 1
return 1;
for(i=3;i<=k;i++) //incepand de la al treilea elem. Acesta se formeaza din suma celor
doi dinaintea lui
{
tn=tv+tn;
tv=tn-tv;
}
return tn;
}
void main()
{
int k, n,i,j,a[20][50];
cout<<"n="; cin>>n;
k=1;
//construim matricea cu termenii fibonacci
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
a[i][j]=fibo(k);
k++;
}
//afisam matricea obtinuta
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
cout<<a[i][j]<<” ”;
cout<<endl;}

19. Se da o matrice de ordinul n. Se considera ca diagonalele sale impart matricea in 4 zone:


nord, sud, vest si est. Se cere sa se calculeze suma elementelor impare din zona de nord a
matricei.
# include <iostream.h>
void main()
{
int a[50][50],n,i,j,s=0,st,dr;
cin>>n; //citim matricea
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
cin>>a[i][j];
for(i=1;i<=n;i++) // parcurg matricea si daca ma aflu deasupra diag.princ si a celei
secundare sunt in zona nord
for(j=1;j<=n;j++)
if ((i<j) && (i+j<n+1) && (a[i][j]%2==1)) //verific daca sunt in zona nord si daca
elem este impar,atunci il adaug la suma
s=s+a[i][j];
cout<<s; }

14
20.Se citeste de la tastatura un cuvant de lungime cel mult 20 de caractere, format numai din
litere mari. Sa se afiseze toate cuvintele distincte ce se pot forma prin eliminarea cate unui
singur caracter din cuvantul dat.
Ex. Pentru cuvantul BINE se vor afisa , nu neaparat in aceasta ordine , cuvintele: INE, BNE,
BIE, BIN .
# include <iostream.h>
# include <string.h>
void main()
{
char x[21],aux[21];
int i;
cout<<"cuvantul: "; cin.get(x,21);
strcpy(aux,x); // copiem in sirul aux sirul initial x
for(i=0;i<strlen(x);i++) //parcurg sirul
{
strcpy(aux+i,aux+i+1); // tot sar peste cate un element de pe poz i
cout<<aux<<endl; //afisez sirul fara caracterul de pe poz i
strcpy(aux,x); //copiez din nou in aux sirul x ca sa pot porni tot de la sirul
initial si ma mut cu o poz mai incolo si sterg caracterul de pe acea pozitie
}
}

21.Se citeste de la tastatura un numar natural.Sa se afiseze cel mai mare numar care se poate
forma cu cifrele distincte ale numarului dat.
Ex. Pentru numarul 29363, multimea cifrelor distincte este {2,3,6,9}, iar numarul cerut este
9632
# include <iostream.h>
void main()
{ int ap[10],c,i;
long n;
cin>>n;
while(n!=0)
{ c= n%10;
ap[c]++; //retin in vectorul ap de cate ori apare cifra c in numarul n
n=n/10;
}
for(i=9;i>=0;i--) parcurg cifrele de la 9 la 0
if(ap[i]!=0) // daca cifra respectiva a aparut in scrierea lui n atunci o afisez si
astfel obtin cel mai mare numar
cout<<i;
cout<<endl;
}

22. Scrieti un program care citeste de la tastatura doua numere naturale n si m si scrie in
fisierul text „DATE.TXT” toate numerele prime din intervalul deschis (n,m). Numerele se
scriu in ordine crescatoare , cate 10 numere pe fiecare linie a fisierului, numerele fiind
despartite intre ele prin cate un spatiu.
Ex. Pentru n=87 si m=241, fisierul „DATE.TXT” va contine
89 97 101 103 107 109 113 127 131 137

15
139 149 151 163 167 173 179 181 191
193 197 199 211 223 227 229 233 239
# include <fstream.h>

void main()
{ FILE *f;
int n,m,cate=0,d,prim=1;
//citim capetele intervalului
cout<<"n="; cin>>n;
cout<<"m="; cin>>m;
f=fopen("date.txt",”w”); //Descchidem fisierul pt scriere in el
if(n%2!=0) // daca numarul nu e par cresc cu doi ca sa vad daca nr e prim(pt ca nu
am numere pare prime decat pe 2) altfel daca e par cresc cu 1
n+=2;
else
n=n+1;
for(int x=n;x<=m;x+=2) //parcurg intervalul si vad daca fiecare nr din interval e
prim, ala care e prim il scriu
prim=1;
for (d=2;d<=x/2;d++)
if(x %d==0)
prim=0;
if (prim==1)
{
f<<x<<" "; // scriu in fisier
cate++; //numar cate nr prime am
if(cate%10= =0) //daca am 10 numere deja scrise trec la randul urmator
f<<endl;
}
f.close(); //inchid fisierul
}

23. Pentru un numar natural n dat, afisati descompunerea lui in factori primi. Se va folosi cel
putin un subprogram in rezolvarea cerintei.
Ex. Pentru n=48 se va afisa factorul 2 la puterea 4
Factorul 3 la puterea 1.
# include <iostream.h>
void desc(int x)
{ // subprogram pentru descom. in factori primi
int d=2,p;
while(x!=1) //cat timp nr e diferit de 1
{
p=0; //puterea la care apare un divizor prim a numarului
while(x%d= =0) //tot impart numarul la divizorul d pana nu mai putem si retinem de
fiecare data in p puterea
{
x=x/d;
p++;
}
if(p>0)

16
cout<<"Factorul "<<d<<" apare de "<<p<<" ori "<<endl;
d++;}
}
void main()
{
int n;
cout<<"n="; cin>>n;
desc(n);
}

24.Pentru un numar natural n dat sa se construiasca recursiv triunghiul de numere ca in


exemplul de mai jos fara a folosi nici o structura repetitiva.
1
1 2
1 2 3
1 2 3 4
....................
1 2 3 4 ..... n.
# include <iostream.h>
void f(int n)
{
if(n>0) // daca numarul e mai mare ca zero atunci tot apelam f pt un numar tot cu o
unitate mai putin si parcurgand de la 1 si pana la n la care ma aflu tot scriu numerele pe rand
{
f(n-1);
for(int i=1;i<=n;i++)
{
cout<<i<<" ";
}
cout<<endl;
}
}
void main()
{
int n;
cin>>n;
f(n);
}

25. Un tablou unidimensional v contine n numere reale ordonate crescator. Sa se afiseze in ce


pozitie din v se gaseste un numar real x dat. Daca nu se gaseste in v atunci sa se afiseze un
mesaj corespunzator. Se va folosi o metoda eficienta de cautare.
# include <iostream.h>
int cautare(int v[],int x,int st,int dr)
{ // cautarea binara: facem cautarea pe jumatati de interval si tot impartim intervalele in altele
mai mici pana ajungem sa avem un singur element ,daca acesta este egal cu x s-a gasit si
returnam poz.m
int gasit=0,m;
st=1; dr=n; gasit=0;
while (st<=dr && gasit==0)

17
{ m=(st+dr)/2;
if (v[m]==x) gasit=1;
else
if (v[m]>x)
dr=m-1;
else st=m+1;
}
if (gasit==1)
return m;
else
return 0;
}
void main()
{
int v[50],n,x,i;
cin>>n;
for(i=1; i<=n;i++)
cin>>v[i];
cout<<"x="; cin>>x;
if(cautare(v,x,1,n)= =0)
cout<<"nu se afla in sir";
else
cout<<cautare(v,x,1,n);
}

18