P. 1
rezolvari atestat2010 - miercuri - c++

rezolvari atestat2010 - miercuri - c++

|Views: 5,323|Likes:
Published by anonymus12

More info:

Categories:Types, School Work
Published by: anonymus12 on May 18, 2010
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as DOC, PDF, TXT or read online from Scribd
See more
See less

08/20/2013

pdf

text

original

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

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->