+ All Categories
Home > Documents > rezolvari atestat2010 - miercuri - c++

rezolvari atestat2010 - miercuri - c++

Date post: 19-Jun-2015
Category:
Upload: anonymus12
View: 4,575 times
Download: 3 times
Share this document with a friend
24
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 } 1
Transcript
Page 1: rezolvari atestat2010 - miercuri - c++

Rezolvari atestat 20101.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 deimpartitulreturn d;

elsereturn 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 fractiecout<<"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 astfelfor (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

Page 2: rezolvari atestat2010 - miercuri - c++

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 numarulwhile(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/mcout<<”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

Page 3: rezolvari atestat2010 - miercuri - c++

c= x%10o=o*10+c;x=x/10;

}return o;

}int nprim(int x){//testam daca un numar este primint 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 numarnatural 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

Page 4: rezolvari atestat2010 - miercuri - c++

# 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 9cout<<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 numereleif(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

Page 5: rezolvari atestat2010 - miercuri - c++

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 ik=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 primint 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 nucout<<"n="; cin>>n; //citesc naux=n; //il retin in aux pe n pt ca dupa ce parcurg while n ajunge 0while(n!=0){

if(prim(n)==0) //verific daca n nu este primok=0;

5

Page 6: rezolvari atestat2010 - miercuri - c++

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;

}}

elsecout<<"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 primint 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

Page 7: rezolvari atestat2010 - miercuri - c++

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 0return 1;

elsereturn 0;

}int main(){

int x[30],n,cate=0;//citim un vector si daca termenul citit este nr fibonacci il contorizez in catecin>>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

Page 8: rezolvari atestat2010 - miercuri - c++

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 multimeafor(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

Page 9: rezolvari atestat2010 - miercuri - c++

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 vectorcout<<"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 xfor(j=1;j<=m;i++) // parcurg elementele vectorului y si vad cate sunt mai mici decat

cel mai mic numar din vectorul xif(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 50999867se 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 adunatet =(a%10+b%10)/10;a=a/10;

9

Page 10: rezolvari atestat2010 - miercuri - c++

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

Page 11: rezolvari atestat2010 - miercuri - c++

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

Page 12: rezolvari atestat2010 - miercuri - c++

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 vectorulcin>>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

Page 13: rezolvari atestat2010 - miercuri - c++

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 vectorulcin>>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 apfor(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 luii=1;

13

Page 14: rezolvari atestat2010 - miercuri - c++

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 fibonaccifor(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

Page 15: rezolvari atestat2010 - miercuri - c++

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 xfor(i=0;i<strlen(x);i++) //parcurg sirul{

strcpy(aux+i,aux+i+1); // tot sar peste cate un element de pe poz icout<<aux<<endl; //afisez sirul fara caracterul de pe poz istrcpy(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 nn=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

Page 16: rezolvari atestat2010 - miercuri - c++

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 elif(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 fisiercate++; //numar cate nr prime am

if(cate%10= =0) //daca am 10 numere deja scrise trec la randul urmatorf<<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

Page 17: rezolvari atestat2010 - miercuri - c++

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 21 2 31 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

Page 18: rezolvari atestat2010 - miercuri - c++

{ m=(st+dr)/2; if (v[m]==x) gasit=1;elseif (v[m]>x)dr=m-1;else st=m+1;

}if (gasit==1)return m;elsereturn 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


Recommended