Se citesc din fişierul “numere.in”, de pe 2 linii consecutive, 2 numere mari scrise în baza 10, fiecare având cel mult 50 de cifre. Să se scrie un program care să calculeze suma lor, folosind şiruri în care se memorează cifrele numerelor. Rezultatul se va afişa în fişierul ”numere.out”. Exemplu: 1. Problema sumei a doua numere mari.
numere.in numere.out 1000000000099999 1000000000300000 200001 Rezolvare: # include < fstream.h > # include < iostream.h > int a [ 51 ] , b [ 51 ] , c [ 51 ], n , m , p; void citire() { ifstream fin("numere.in"); char s [ 51 ]; fin >> s; n = strlen( s ); for(int i = n-1; i >= 0; i--) a [ n-i-1 ] = s [ i ] – '0'; fin >> s; m = strlen( s ); for(int i = m-1; i >= 0; i--) b [ n-i-1 ] = s [ i ] – '0'; if( n > m) p = n; else p = m; } void solve() { int t = 0; for(int i = 0; i < p ; ++ i) { c [ i ] = (a [ i ] + b [ i ] + t) % 10; t = (a [ i ] + b [ i ] + t)/10; } if( t ) c [ p ++ ] = t; } void afisare() { ofstream fout("numere.out");
for ( int i = p-1; i >= 0; -- i ) fout << c [ i ] << " "; fout.close(); } void main() { citire(); solve(); afisare(); }
Reviono la meniu ! Top ! 2. Suma a doua polinoame. Se citesc din fişierul “pol.in”, de pe prima linie, gradele a
două polinoame n,m (0≤n,m≤50). De pe următoarele două linii se citesc două şiruri de numere reale care reprezintă coeficienţii celor două polinoame, în ordinea crescătoare a gradelor. Să se scrie un program care să construiască în memorie şi să afişeze în fişierul ”pol.out” suma polinoamelor. Coeficienţii sumei se vor afişa cu două zecimale separaţi printr-un singur spaţiu. Exemplu:
pol.in pol.in pol.out pol.out 23 3 7 -1 1 12 2 -3 1 5 3 -4 1 # include < iomanip.h > # include < fstream.h > double a [ 51 ] , b [ 51 ] , c [ 51 ]; int n , m , p; void citire() { ifstream fin("pol.in"); fin >> n >> m; for(int i = 0; i <= n; ++i) fin >> a [ i ]; for(int j = 0; j <= m; ++j) fin >> b [ j ]; if( n > m) p = n; else p = m;
for ( int i = p-1; i >= 0; -- i ) fout << c [ i ] << " "; fout.close(); } void main() { citire(); solve(); afisare(); }
Reviono la meniu ! Top ! 2. Suma a doua polinoame. Se citesc din fişierul “pol.in”, de pe prima linie, gradele a
două polinoame n,m (0≤n,m≤50). De pe următoarele două linii se citesc două şiruri de numere reale care reprezintă coeficienţii celor două polinoame, în ordinea crescătoare a gradelor. Să se scrie un program care să construiască în memorie şi să afişeze în fişierul ”pol.out” suma polinoamelor. Coeficienţii sumei se vor afişa cu două zecimale separaţi printr-un singur spaţiu. Exemplu:
pol.in pol.in pol.out pol.out 23 3 7 -1 1 12 2 -3 1 5 3 -4 1 # include < iomanip.h > # include < fstream.h > double a [ 51 ] , b [ 51 ] , c [ 51 ]; int n , m , p; void citire() { ifstream fin("pol.in"); fin >> n >> m; for(int i = 0; i <= n; ++i) fin >> a [ i ]; for(int j = 0; j <= m; ++j) fin >> b [ j ]; if( n > m) p = n; else p = m;
} void solve() { int t = 0; for(int i = 0; i <= p ; ++ i) c [ i ] = a [ i ] + b [ i ]; } void afisare() { ofstream fout("pol.out"); for ( int i = 0; i <= p; ++ i ) fout << setiosflayes(ios::showpoint) << setprecision(2) << c[i] << " "; fout.close(); } void main() { citire(); solve(); afisare(); } Reviono la meniu ! Top ! Se citesc din fişierul “pol.in”, de pe prima linie, gradele a două polinoame n,m (0≤n,m≤50). De pe următoarele două linii se citesc două şiruri de numere reale care reprezintă coeficienţii celor două polinoame, în ordinea crescătoare a gradelor. Să se scrie un program care să construiască în memorie şi să afişeze în fişierul ”pol.out” produsul polinoamelor. Coeficienţii produsului se vor afişa cu două zecimale separaţi printr-un singur spaţiu . Exemplu: 3. Produsul a doua polinoame.
pol.in pol.in pol.out pol.out 31 4 1 5 -2 1 2 11 1 0 1 21
# include < iomanip.h > # include < fstream.h > double a [ 51 ] , b [ 51 ] , c [ 51 ]; int n , m , p; void citire()
{ ifstream fin("pol.in"); fin >> n >> m; for(int i = 0; i <= n; ++i) fin >> a [ i ]; for(int j = 0; j <= m; ++j) fin >> b [ j ]; p = m + n; } void solve() { int t = 0; for(int i = 0; i <= p ; ++ i) c [ i + j ] += a [ i ] * b [ i ]; } void afisare() { ofstream fout("pol.out"); for ( int i = 0; i <= p; ++ i ) fout << setiosflayes(ios::showpoint) << setprecision(2) << c[i] << " "; fout.close(); } void main() { citire(); solve(); afisare(); } Reviono la meniu ! Top ! Se citesc din fişierul “sort.in”, de pe prima linie, 2 numere n şi m (1≤n,m≤50). De pe următoarele 2 linii se citesc elementele a două şiruri de lungime n, respectiv m, , numere întregi, de maxim 9 cifre, care sunt ordonate crescător. Să se scrie un program care să construiască în memorie un şir care conţine rezultatul interclasării celor două şiruri. Şirul rezultat se va afişa în fişierul ”sort.out”. Exemplu: 4.Sortarea prin interclasare.
sort.in sort.out 54 112334678 13478 1236
# include < fstream.h > long a [ 51 ] , b [ 51 ] , c [ 51 ]; int n , m , nr; void citire() { ifstream fin("pol.in"); fin >> n >> m; for(int i = 1; i <= n; ++i) fin >> a [ i ]; for(int j = 1; j <= m; ++j) fin >> b [ j ]; } void solve() { int i = 1 , j = 1; while( i <= n && j <= m ) if(a [ i ] < b [ j ] ) c [ ++nr ] = a [ i++ ]; else c [ ++nr ] = b [ j++ ]; if( i > n) for(; j <= m; ++j) c [ ++nr ] = b [ j ]; else for(; i <= n; ++i) c [ ++nr ] = a [ i ]; } void afisare() { ofstream fout("sort.out"); for ( int i = 1; i <= nr; ++ i ) fout << c [ i ] << " "; fout.close(); } void main() { citire(); solve(); afisare(); } Reviono la meniu ! Top !
Se citesc din fişierul “mult.in”, de pe prima linie, 2 numere n şi m (1≤n,m≤50). De pe următoarele două linii se citesc elementele a două şiruri de lungime n, respectiv m, numere întregi, de maxim 9 cifre. Elementele şirurilor sunt distincte două cate două. Scrieţi un program, care să construiască în memorie un şir ce va conţine intersecţia celor două şiruri. Rezultatul se va afişa în fişierul ”mult.out”. Exemplu: 5. Intersectia a doua siruri , multimi.
mult.in mult.out 54 13 13478 1236
# include < fstream.h > long a [ 51 ] , b [ 51 ] , c [ 51 ]; int n , m , p; void citire() { ifstream fin("mult.in"); fin >> n >> m; for(int i = 1; i <= n; ++i) fin >> a [ i ]; for(int j = 1; j <= m; ++j) fin >> b [ j ]; } void solve() { for(int i = 1; i <= n; ++i) for(int j = 1; j <= m; ++j) if( a [ i ] == b [ j ]) { c [ ++p ] = a [ i ]; break; } } void afisare() { ofstream fout("mult.out"); for ( int i = 1; i <= p; ++ i ) fout << c [ i ] << " "; fout.close();
} void main() { citire(); solve(); afisare(); } Reviono la meniu ! Top ! Se citesc din fişierul “mult.in”, de pe prima linie, 2 numere n şi m (1≤n,m≤50). De pe următoarele două linii se citesc elementele a două şiruri de lungime n, respectiv m, numere întregi, de maxim 9 cifre. Elementele şirurilor sunt distincte două cate două. Scrieţi un program, care să construiască în memorie un şir ce va conţine intersecţia celor două şiruri. Rezultatul se va afişa în fişierul ”mult.out”. Exemplu: 6. Diferenta a doua siruri , multimi.
mult.in mult.out 54 478 13478 1236
# include < fstream.h > long a [ 51 ] , b [ 51 ] , c [ 51 ]; int n , m , p; void citire() { ifstream fin("mult.in"); fin >> n >> m; for(int i = 1; i <= n; ++i) fin >> a [ i ]; for(int j = 1; j <= m; ++j) fin >> b [ j ]; } int caut(long x) { for( int i = 1; i <= m ; ++i) if( b [ i ] == x) return 1;
return 0; } void solve() { for(int i = 1; i <= n; ++i) if( caut(a[i]) == 0) c [ ++p ] = a [ i ]; } void afisare() { ofstream fout("mult.out"); for ( int i = 1; i <= p; ++ i ) fout << c [ i ] << " "; fout.close(); } void main() { citire(); solve(); afisare(); } Reviono la meniu ! Top ! Se citesc din fişierul “mult.in”, de pe prima linie, 2 numere n şi m (1≤n,m≤50). De pe următoarele două linii se citesc elementele a două şiruri de lungime n, respectiv m, numere întregi, de maxim 9 cifre. Elementele şirurilor sunt distincte două cate două. Să se scrie un program, care să construiască în memorie un şir ce va conţine reuniunea celor două şiruri. Rezultatul se va afişa în fişierul ”mult.out”. Exemplu: 7. Reuniunea a doua siruri , multimi.
mult.in mult.out 54 1234678 13478 1236
# include < fstream.h > long a [ 51 ] , b [ 51 ] , c [ 51 ];
int n , m , p; void citire() { ifstream fin("mult.in"); fin >> n >> m; for(int i = 1; i <= n; ++i) fin >> a [ i ]; for(int j = 1; j <= m; ++j) fin >> b [ j ]; } int caut(long x) { for( int i = 1; i <= m ; ++i) if( c [ i ] == x) return 1; return 0; } void solve() { for(int i = 1; i <= m; ++i) c [ i ] = b [ i ]; p=m; for(int i = 1; i <= n; ++i) if( caut(a[i]) == 0) c [ ++p ] = a [ i ]; } void afisare() { ofstream fout("mult.out"); for ( int i = 1; i <= p; ++ i ) fout << c [ i ] << " "; fout.close(); } void main() { citire(); solve(); afisare(); } Reviono la meniu ! Top ! 8. Verifica un sir daca are toate elemente unice.
Se citeşte din fişierul “mult.in”, de
pe prima linie, un număr n (1≤n≤50). De pe următoarea linie se citesc elementele unui şir de lungime n, numere întregi, de maxim 9 cifre. Să se scrie un program care să verifice dacă şirul citit conţine numai elemente distincte. Exemplu:
mult.in mult.out 5 DA 13478
# include < iostream.h > # include < fstream.h > long a [ 51 ] ; int n; void citire() { ifstream fin("mult.in"); fin >> n; for(int i = 1; i <= n; ++i) fin >> a [ i ]; } int solve() { for( int i = 1; i <= n ; ++i) for( int j = i+1 ; j <= n ; ++j) if( a[ i ] == a[ j ]) return 0; return 1; } void main() { citire(); if(solve()) cout << "DA"; else couit << "NU"; } Reviono la meniu ! Top !
Se citesc din fişierul “mult.in”, de pe prima linie, elementele unui liste simplu înlănţuite, , numere întregi, de maxim 9 cifre. Să se scrie un program care să verifice dacă lista citită conţine numai elemente distincte. Exemplu: 9. Verifica o lista daca are toate elementele unice.
mult.in mult.out 1 3 1 7 8 NU
# include < fstream.h > # include < iostream.h > ifstream fin ("mult.in"); struct nod { long inf; nod * urm; }; nod *prim=NULL, *ultim=NULL; void adaugare_la_sfarsit(long x) { nod *aux; aux = new nod; aux->inf = x; aux->urm = NULL; if( prim == NULLL ) prim = aux; else ultim->urm = aux; aux = aux; } void citire() { long x; while(fin>>x) adaugare_la_sfarsit(x); fin.close(); } int verific() {
for( nod *p = p->urm; p ; p = p->urm) for( nod *q = p->urm ; q; q = q->urm) if( p->inf == q->inf) return 0; return 1; } void main() { citire(); if(verif()) cout << "DA"; else cout << "NU"; } Reviono la meniu ! Top ! Se citesc din fişierul “mult.in”, de pe prima linie, elementele unui liste simplu înlănţuite, , numere întregi, de maxim 9 cifre. Să se scrie un program care să verifice dacă lista citită conţine numai elemente distincte. Exemplu: 10. Metoda bulelor, sorteaza crescator o lista folosind metoda bulelor.
sort.in sort.out 3841924 1234489
# include < fstream.h > # include < iostream.h > ifstream fin ("sort.in"); ofstream fout ("sort.out"); struct nod { long inf; nod * urm; }; nod *prim=NULL, *ultim=NULL; void adaugare_la_sfarsit(long x) { nod *aux;
aux = new nod; aux->inf = x; aux->urm = NULL; if( prim == NULLL ) prim = aux; else ultim->urm = aux; aux = aux; } void citire() { long x; while(fin>>x) adaugare_la_sfarsit(x); fin.close(); } void sortez() { int ok; do{ok=1 for(nod *q = prim; q->urm ;q = q->urm) if( q->inf > q->urm->inf) { long aux = q->inf; q->inf = q->urm->inf; q->urm->inf = aux; ok=0; } }while (!ok); } void afisare() { for( nod *p = prim; p ; p = p->urm) fout << p->inf <<" " ; fout.close(); } void main() { citire(); sorteaza(); afisare(); }
Se citeşte din fişierul “sort.in”, de pe prima linie, un număr n (1≤n≤50). De pe următoarea linie se citesc elementele unui şir de lungime n, numere întregi, de maxim 9 cifre. Să se scrie un program care să realizeze sortarea crescătoare a elementelor şirului folosind metoda selecţiei. Rezultatul se va afişa în fişierul ”sort.out”. Exemplu: 11. Sortarea unui şir prin metoda selecţiei.
sort.in sort.out 7 1234489 3841924
# include < fstream.h > long a [ 51 ] ; int n; void citire() { ifstream fin("sort.in"); fin >> n; for(int i = 1; i <= n; ++i) fin >> a [ i ]; fin.close(); } void sortare() { int p; for(int i = 1 ; i <= n; i++) { p = i; for(int j = i+1,j <= n; j++) if( a[j] < a[p]) p = j; long aux = a[ i ]; a[ i ] = a[ p ]; a[ p ] = aux; } } void afisare() { ofstream fout("sort.out"); for ( int i = 1; i <= n; ++ i )
fout << a [ i ] << " "; fout.close(); } void main() { citire(); sortare(); afisare(); } Reviono la meniu ! Top ! Se citeşte din fişierul “sort.in”, de pe prima linie, un număr n (1≤n≤50). De pe următoarea linie se citesc elementele unui şir de lungime n, numere întregi, de maxim 9 cifre. Să se scrie un program care să realizeze sortarea crescătoare a elementelor şirului folosind metoda inserţiei. Rezultatul se va afişa în fişierul ”sort.out”. Exemplu: 12. Sortarea unui şir prin metoda inserţiei.
sort.in sort.out 7 1234489 3841924 # include < fstream.h > long a [ 51 ] ; int n; void citire() { ifstream fin("sort.in"); fin >> n; for(int i = 1; i <= n; ++i) fin >> a [ i ]; fin.close(); } void sortare() { int i,j; long aux; for(i = 2;i <= n; i++) { aux = a[i]; for( j = i-1; j >= 1 && a[j] > aux; j--)
a[ j++ ] = a[ j ]; a[ j+1 ] = aux; } } void afisare() { ofstream fout("sort.out"); for ( int i = 1; i <= n; ++ i ) fout << a [ i ] << " "; fout.close(); } void main() { citire(); sortare(); afisare(); } Reviono la meniu ! Top ! Se citeşte din fişierul “sort.in”, de pe prima linie, un număr n (1≤n≤50). De pe următoarea linie se citesc elementele unui şir de lungime n, numere întregi, de maxim 9 cifre. Să se scrie un program care să realizeze sortarea crescătoare a elementelor şirului folosind metoda numărării. Se va ţine cont de faptul că în şir poate să apară un element şi de mai multe ori. Rezultatul se va afişa în fişierul ”sort.out”. Exemplu: 13. Sortarea unui şir prin metoda numarari.
sort.in sort.out 7 1234489 3841924
# include < fstream.h > long a [ 51 ], b[ 51 ] ; int n, nr [ 51 ]; void citire() { ifstream fin("sort.in"); fin >> n;
for(int i = 1; i <= n; ++i) fin >> a [ i ]; fin.close(); } void sortare() { int i,j; for(i = 1;i <= n-1; i++) for(j = i+1;j <= n; j++) if(a[ i ] < a[ j ]) nr[ j ]++; else nr[ i ]++; for(i = 1;i <= n;i++) b[ nr[ i ] + 1 ] = a[ i ]; } void afisare() { ofstream fout("sort.out"); for ( int i = 1; i <= n; ++ i ) fout << a [ i ] << " "; fout.close(); } void main() { citire(); sortare(); afisare(); } Reviono la meniu ! Top ! Se citeşte din fişierul “cmmdc.in”, de pe prima linie, un număr natural n (1≤n≤50). De pe următoarea linie se citesc n numere naturale de maxim 9 cifre.. Să se scrie un program care să calculeze cel mai mare divizor comun al celor n numere de pe linia a doua a fişierului. Rezultatul se va afişa în fişierul ”cmmdc.out”. Exemplu: 14. Cmmdc Cel mai mare divizor comun dintr-un şir.
cmmdc.in cmmdc.out 5 2 14 8 22 4 32
# include < fstream.h > ifstream fin("cmmdc.in"); ofstream fout("cmmdc.out"); long a [ 51 ]; int n; void citire() { fin >> n; for(int i = 1; i <= n; ++i) fin >> a [ i ]; fin.close(); } long cmmdc(long x, long y) { long r; while( y > 0) { r = x % y; x = y; y = r; } } long calc() { long v = a[1]; for(int i = 2;i <= n; i++) v = cmmdc(v,a[i]); return v; } void main() { citire(); fout << calc(); fout.close(); } Reviono la meniu ! Top ! 15. Divizori dintr-un şir metoda eficienta.
Se citeşte din fişierul “exista.in”, de pe
prima linie, un număr n (1≤n≤50). De pe următoarea linie se citesc n numere naturale de maxim 9 cifre reprezentând elementele unui şir. Să se scrie un program care să verifice dacă există în şir trei elemente alăturate care au acelaşi număr de divizori. Exemplu:
exista.in DA 8 9 4 15 6 22 12 3 14
# include < fstream.h > # include < iostream.h > # include < math.h > ifstream fin("exista.in"); long a [ 51 ]; int n; void citire() { fin >> n; for(int i = 1; i <= n; ++i) fin >> a [ i ]; fin.close(); } int nrdiv(long x) { long d; int nr = 0 ; for( d = 1; d <= sqrt(x); d++) if(x%d == 0) nr += 2; if(sqrt(x) == (int) sqrt(x)) nr--; return nr; } void verif() { int ok = 0; for(int i = 1;i <= n-2; i++) if( nrdiv(a[i]) == nrdiv(a[ i+1 ]) ) if( nrdiv(a[i]) == nrdiv(a[ i+2 ]) )
ok = 1; if(ok) cout << "DA"; else cout << "NU"; fout.close(); } void main() { citire(); verif(); } Reviono la meniu ! Top ! Se citeşte din fişierul “frecv.in”, de pe prima linie, un număr n (1≤n ≤50). De pe următoarea linie se citesc elementele unui şir de lungime n, numere întregi, de maxim 9 cifre.. Să se scrie un program care să introducă într-o listă simplu înlănţuită elementele distincte ale şirului, împreună cu frecvenţa lor de apariţie, şi afişează rezultatul în fişierul “frecv.out”. Exemplu: 16. Frecventa elementelor dintr-un sir, intr-o lista.
Frecv.out frecv.in 9 apare de 1 ori 11 9 4 15 6 12 12 3 15 1 12 4 4 apare de 2 ori 15 apare de 2 ori 6 apare de 1 ori 12 apare de 3 ori 3 apare de 1 ori 1 apare de 1 ori # include < fstream.h > ifstream fin ("frecv.in"); ofstream fout ("frecv.out"); struct nod { long inf; int frecv; nod * urm; }; nod *prim=NULL, *ultim=NULL;
void adaugare_la_sfarsit(long x) { nod *aux; aux = new nod; aux->inf = x; aux->frecv = 1; aux->urm = NULL; if( prim == NULLL ) prim = aux; else ultim->urm = aux; aux = aux; } void construiesc() { int n; fin >> n; long x; for(int i = 1 ; i <= n ; i ++ ) { fin >> x; int ok = 0; for( nod *q = prim; q ; q = q->urm) if(q->inf == x) { q->frecv++ ; ok = 1; break; } if(!ok) adaugare_la_sfarsit(x); } } void afisare() { for( nod *p = prim; p ; p = p->urm) fout << p->inf <<" apare de "<< q->frecv << " ori\n" ; fout.close(); } void main() { construiesc(); afisare(); fin.close(); }
Reviono la meniu ! Top ! Se citeşte din fişierul “progresie.in”, de pe prima linie, un număr n (1≤n≤50). De pe următoarea linie se citesc elementele unui şir de lungime n, numere întregi, de maxim 9 cifre.. Să se scrie un program care să verifice dacă elementele şirului formează o progresie aritmetică sau o progresie geometrică. În caz afirmativ să se afişeze tipul progresiei şi raţia, iar în caz negativ să se scrie un mesaj corespunzător în fişierul ”progresie.out”. Exemplu: 17. Sir in progresie geometrica sau progresie aritmetica.
progresie.in progresie.out 5 elementele şirului formează o progresie geometrică cu raţia 3 2 6 18 54 162
# include < fstream.h > ifstream fin("progresie.in"); ofstream fout("progresie.out"); long a [ 51 ]; int n; void citire() { fin >> n; for(int i = 1; i <= n; ++i) fin >> a [ i ]; fin.close(); } int progarit() { for(int i = 2; i <= n; i++) if(a[ i ] != (a[ i-1 ] + a[ i+1 ])/2.0) return 0; return 1; } int proggeom()
{ for(int i = 2; i <= n; i++) if(a[ i ] * a[ i ] != a[ i-1 ] * a[ i+1 ] ) return 0; r return 1; } void main() { citire(); if(progarit()) fout << "Progresie aritmetica cu ratia " << a[2] - a[1]; else if(proggeom()) fout << "Progresie geometrica cu ratia " << a[2]/a[1]; else fout << "Nu este nimic"; } Reviono la meniu ! Top ! 18. Frecventa literelor dintr-un şir. Se citeşte un text din fişierul ”text.in”. Textul are
mai multe linii şi mai multe cuvinte. Pe fiecare linie cuvintele sunt despărţite prin câte un singur spaţiu sau prin semne de punctuaţie. Să se afişeze în fişierul ”text.out”, pe linii consecutive, toate literele care apar în text, împreună cu frecvenţele lor de apariţie. Exemplu:
text.out text.in Mama are un mar. A – 6 Ce mare e marul! C – 1 E–4 M–5 N – 1 R–4 U-2
# include < fstream.h > # include < string.h > ifstream fin("text.in"); ofstream fout("text.out"); char c; int a[50];
void citire() { while(fin >> c) { if( c >= 'a' && c <= 'z') c = c - 32; if( c >= 'A' && c <= 'Z') a[ c-'A']++; } } void afisare() { for(int i = 0 ;i <= 30 ; i++) if( a[i] != 0) fout << i+'A' << " - "<< a[i] << endl; } void main() { citire(); afisare(); fout.close(); fin.close(); } Reviono la meniu ! Top ! Să se afişeze în fişierul “prietene.out” toate perechile de numere prime prietene mai mici decât un număr natural n citit de la tastatură (1≤n≤30000). Două numere prime se numesc prietene dacă diferenţa lor în modul este mai mică sau egală cu 2. Exemplu: 19. Perechi de numere prietene.
n=20 (1 2), (1 3), (2 3), (3 5), (5 7), (11 13), (17 19)
# include < iostream.h > # include < math.h > int n;
int prim(int x) { if(x < 2) return 0; for(int d = 2; d <= sqrt(x); ++d) if( x%d == 0) return 0; return 1; } void generare() { cin >> n; if(n < 2) return; cout << "2 3" << endl; for(int i = 3; i <= n ;i += 2) if(prim(i) && prim(i+2)) cout << i << " " << i+2 << endl; } void main() { generare(); } Reviono la meniu ! Top ! Se citeşte un număr natural n de la tastatură (1≤n≤30000). Să se verifice dacă n este număr puternic. Un număr este puternic dacă are mai mulţi divizori decat orice număr mai mic decât el. Exemplu: 20. Numar puternic.
6 DA 10 NU
# include < iostream.h > # include < math.h > int n; int nrdiv(long x) { long d;
int nr = 0 ; for( d = 1; d <= sqrt(x); d++) if(x%d == 0) nr += 2; if(sqrt(x) == (int) sqrt(x)) nr--; return nr; } int puternic() { int nrdn = nrdiv(n); for(int i = 1;i <= n-1; i++) if( nrdiv(i) >= nrdn) return 0; return 1; } void main() { cin >> n; if(puternic()) cout << "DA"; else cout << "NU"; } Reviono la meniu ! Top ! Se citeşte de la tastatură un număr natural k (1≤k≤50). Să se determine cel mai mic număr natural care are exact k divizori. Exemplu: 21. Numar cu exact k divizori.
5 - 16
# include < iostream.h > # include < math.h > int k; int nrdiv(long x) { long d; int nr = 0 ;
for( d = 1; d <= sqrt(x); d++) if(x%d == 0) nr += 2; if(sqrt(x) == (int) sqrt(x)) nr--; return nr; } void main() { int i, n; cin >> k; n = 1; while( nrdiv(n) != k) ++n; cout << n; } Reviono la meniu ! Top ! Se citeşte din fişierul “mat.in”, de pe prima linie, un număr natural n (1≤n≤50) şi de pe următoarele n linii o matrice pătratică de numere întregi, de maxim 9 cifre.. Să se verifice dacă matricea este pătrat magic (sumele elementelor pe linii, coloane şi de pe cele două diagonale, este aceeaşi).. Exemplu: 22. Matrice patrat magic.
Mat.in 3 DA 438 951 276
# include < iostream.h > # include < fstream.h > long a[51][51]; int n; void citire() { ifstream fin("mat.in");
fin>>n; for(int i = 1; i <= n; ++i) for( int j = 1 ; j <= n; ++ j) fin >> a[i][j]; fin.close(); } int magie() { int i,j; long S1 = 0,S2 = 0; for( i = 1; i <= n; ++i) { S1 = S1 + a[i][i]; S2 = S2 + a[i][n-i+1]; } if(S1 != S2) return 0; for( i = 1 ; i <= n ; ++i) { S2 = 0 ; S3 = 0; for(j = 1; j <= n ; ++j) { S2 = S2 + a[i][j]; S3 = S3 + a[j][i]; } if( S2 != S1 || S3 != S1) return 0; } return 1; } void main() { citire(); if(magie()) cout << "DA"; else cout << "NU"; } Reviono la meniu ! Top ! Se citeşte din fişierul “mat.in” , de pe prima linie, un număr natural n (1≤n≤50), şi de pe următoarele n linii o matrice pătratică ce conţine numere naturale de maxim 4 cifre. Să se numere elementele cu număr par de cifre aflate în triunghiul de sub diagonala principală a matricei şi să se afişeze rezultatul pe ecran. Exemplu: 23. Elemente sub diagonala principală.
Mat.in 4 4 1 4 12 3 13 3 22 5 14 22 2 34 222 11 3 31
# include < iostream.h > # include < fstream.h > int a[51][51]; int n; void citire() { ifstream fin("mat.in"); fin>>n; for(int i = 1; i <= n; ++i) for( int j = 1 ; j <= n; ++ j) fin >> a[i][j]; fin.close(); } int nrcif(int x) { int nr = 0; if( x == 0) return 1; while( x > 0) { x /= 10; ++nr; } return nr; } int rez() { int nr=0; for(int i = 2; i <= n; ++i) for(int j = 1 ; j < i ; ++j)
if( nrcif(a[i][j])%2 == 0) ++nr; return nr; } void main() { citire(); cout << rez(); } Reviono la meniu ! Top ! 24. Suma numere prime de deaspura diagonalei principale. Se citeşte din fişierul
“mat.in”, de pe prima linie, un număr natural n (1≤n≤50), şi de pe următoarele n linii o matrice pătratică ce conţine numere naturale de maxim 4 cifre. Să se calculeze suma elementelor prime aflate în triunghiul de deasupra diagonalei principale a matricei şi să se afişeze rezultatul pe ecran. Exemplu:
Mat.in 4 8 1 4 12 3 13 3 22 5 14 22 2 34 222 11 3 31
# include < iostream.h > # include < fstream.h > int a[51][51]; int n; void citire() { ifstream fin("mat.in"); fin>>n; for(int i = 1; i <= n; ++i) for( int j = 1 ; j <= n; ++ j)
fin >> a[i][j]; fin.close(); } int nrcif(int x) { int nr = 0; if( x == 0) return 1; while( x > 0) { x /= 10; ++nr; } return nr; } int prim(int x) { if(x < 2) return 0; for(int d = 2; d <= sqrt(x); ++d) if( x%d == 0) return 0; return 1; } int rez() { int nr=0; for(int i = 1; i < n; ++i) for(int j = i+1 ; j <= n ; ++j) if( prim(a[i][j])) ++nr; return nr; } void main() { citire(); cout << rez(); } Reviono la meniu ! Top ! Se citeşte din fişierul “mat.in”, de pe prima linie, un număr natural n (1≤n≤50), şi de pe următoarele n linii o matrice pătratică ce conţine numere naturale de maxim 4 cifre. Să se verifice dacă există elemente cu suma cifrelor pară în triunghiul de sub diagonala secundară a matricei şi să se afişeze rezultatul pe ecran. Exemplu: 25. Suma cifrelor pare de sub diagonalei secundara.
Mat.in 4 7 11 5 8 DA 9 5 1 12 3 4 31 15 3 2 23 14
# include < iostream.h > # include < fstream.h > int a[51][51]; int n; void citire() { ifstream fin("mat.in"); fin>>n; for(int i = 1; i <= n; ++i) for( int j = 1 ; j <= n; ++ j) fin >> a[i][j]; fin.close(); } int sumcif(int x) { int s = 0; while( x > 0) { s += x%10; x /= 10; } return s; } int verif() { for(int i = 2; i <= n; ++i) for(int j = n-i+2 ; j <= n ; ++j) if( sumcif(a[i][j])%2 == 0)
return 1; return 0; } void main() { citire(); if(verif()) cout << "DA"; else cout << "NU"; } Reviono la meniu ! Top ! Se citesc din fişierul “mat1.in” de pe prima linie, două numere naturale n1(1≤n1≤50) şi m1 (1≤m1 ≤50) şi de pe următoarele n1 linii o matrice cu n1 linii şi m1 coloane. Analog, se citesc din fişierul “mat2.in”, de pe prima linie, două numere naturale n2 (1≤n2≤50) şi m2 (1≤n≤50) şi de pe următoarele n2 linii o matrice cu n2 linii şi m2 coloane. Elementele celor 2 matrici sunt numere reale. Să se scrie un program în care se calculează produsul celor două matrici. Dacă produsul se poate calcula atunci se va afişa matricea rezultată în fişierul “mat.out”, iar în caz contrar se va afişa un mesaj corespunzător. Exemplu: 27. Inmultirea a doua matrici.
mat1.in 23 312 523
mat.out 13 7 28 12
mat2.in 32 51 02 11
# include < fstream.h > int n1, n2, m1, m2, a[51][51], b[51][51]; void citire(int &n, int &m, int x[51][51], char nume[20]) { ifstream fin(nume);
fin>>n>>m; for(int i = 1; i <= n; ++i) for( int j = 1 ; j <= m; ++ j) fin >> a[i][j]; fin.close(); } void main() { citire(n1, m1, a, "mat1.txt"); citire(n2, m2, b, "mat2.txt"); if(m1 == n2 ) { for(int i = 1; i <= n1; ++i) for(int j = 1 ; j <= m2; ++j) for(int k = 1; k <= m1; ++k) c[i][j] += a[i][k]*b[k][j]; for(int i = 1; i <= n1; ++i) { for(int j = 1; j <= m2; ++j) cout << c[i][j] << " "; cout << endl; } } else cout << "Nu se poate"; } Se citesc din fişierul “mat.in”, de pe prima linie, două numere naturale n şi m (1≤n,m≤50) şi de pe următoarele n linii o matrice cu n linii şi m coloane cu elemente numere întregi, de maxim 9 cifre.. Să se scrie un program care afişează în fişierul “mat.out”, câte unul pe linie, numerele din matrice care sunt în acelaşi timp maxime pe linia şi minime pe coloana pe care se află. Dacă nu există astfel de numere se va afişa un mesaj corespunzător. Exemplu: 28. Maxime pe linie si coloana in matrice.
mat.in 43 1322 2781 4852
mat.out 3
# include < fstream.h > int n, m, min, max; long a[51][51]; void citire() { ifstream fin("mat.in"); fin>>n>>m; for(int i = 1; i <= n; ++i) for( int j = 1 ; j <= m; ++ j) fin >> a[i][j]; fin.close(); } void main() { cititre(); for(int i = 1; i <= n ; ++i) { max = a[i][1]; for(int j = 1; i <= m; ++j) if( a[i][j] > max) max= a[i][j]; for(int j = 1 ; j <= m; ++j) if(a[i][j] == max) { min = a[i][1]; for(int k = 2; k <= n; ++k) if( a[i][k] < min) min = a[i][k]; if(min == max) cout << a[i][j] <<" "; } } } Reviono la meniu ! Top ! Se citesc din fişierul “mat.in” , de pe prima linie, două numere naturale n şi m (1≤n,m≤50) şi de pe următoarele n linii o matrice cu n linii şi m coloane cu elemente numere naturale, de maxim 9 cifre.. Să se scrie un program care afişează în fişierul “mat.out”, câte unul pe linie, numerele din matrice care au număr maxim de divizori. Exemplu: 29. Numar maxim de divizori in matrice.
mat.in 14 9 3 14 10 8 5 6 21 11 3 15 17
mat.out 14 10 8 6 21 15
# include < fstream.h > int n, m; long a[51][51]; ifstream fout("mat.out"); void citire() { ifstream fin("mat.in"); fin>>n>>m; for(int i = 1; i <= n; ++i) for( int j = 1 ; j <= m; ++ j) fin >> a[i][j]; fin.close(); } void main() { cititre(); int max = nrdiv(a[1][1]); for(int i = 1; i <= n ; ++i) for(int j = 1; i <= m; ++j) if( nrdiv(a[i][j])> max) max = nrdiv(a[i][j]); for(int i = 1; i <= n ; ++i) for(int j = 1; i <= m; ++j) if( nrdiv(a[i][j]) == max) fout << a[i][j]; fout.close(); } Reviono la meniu ! Top ! 30. Sterge o line si o coloana din matrice. Se citesc din fişierul “mat.in” , de pe prima
linie, patru numere naturale n, m, l şi c (1≤n,m≤50 , 1≤l ≤n, 1≤c ≤m) şi de pe
următoarele n linii o matrice cu n linii şi m coloane, cu elemente numere întregi, de maxim 9 cifre.. Să se scrie un program care să şteargă din matrice linia l şi coloana c şi afişează matricea rezultată în fişierul “mat.out”. Exemplu:
mat.in mat.out 1423 124 1234 9 10 12 5678 9 10 11 12
# include < fstream.h > int n, m, l, c; long a[51][51]; ifstream fout("mat.out"); void citire() { ifstream fin("mat.in"); fin>>n>>m>>l>>c; for(int i = 1; i <= n; ++i) for( int j = 1 ; j <= m; ++ j) fin >> a[i][j]; fin.close(); } void sterge_l() { for(int i = l + 1; i <= n ; ++i) for(int j = 1; j <= m ; ++j) a[i-1][j] = a[i][j]; n--; } void sterge_c() { for(int j = l + 1; j <= m ; ++j) for(int i = 1; i <= n ; ++i) a[i][j-1] = a[i][j]; m--; }
void main() { cititre(); sterge_l(); sterge_c(); } Reviono la meniu ! Top ! 31. Triunghiul lui Pascal. Se citeşte un număr natural n (1≤n≤15). Să se afişeze în
fişierul “Pascal.out” trunghiul lui Pascal care are n + 1 linii şi n + 1 coloane. Regulile după care se construieşte triunghiul lui Pascal sunt: a. Pe coloana 0 şi pe diagonala principală se pune 1. b. Restul elementelor din triunghi se obţin adunând elemental aflat pe linia anterioară pe aceeaşi coloană cu el cu elemental aflat pe linia anterioară şi pe coloana anterioară. Exemplu:
3
Pascal.out 1 11 121 1331
# include < iostream.h > # include < fstream.h > int n; long a[51][51]; ifstream fout("pascal.out"); void pascal() { a[1][1] = 1; for(int i = 2; i <= n+1; ++i) { a[i][1] = 1; for(int j = 2; j <= i-1; ++j) a[i][j] = a[i-1][j] + a[i-1][[j]; a[i][i] = 1; } }
void afisare() { for(int i = 1; i <= n+1; ++i) { for(int j = 1; j <= n+1; ++j) fout << a[i][j] << " "; fout << endl; } } void main() { cin>>n; pascal(); afisare(); } Reviono la meniu ! Top ! Se citesc de la tastatură numitorii şi numărătorii (numere întregi de maxim 9 cifre) a două fracţii. Să se scrie un program care simplifică suma celor două fracţii şi afişează pe ecran numitorul şi numărătorul fracţiei rezultate. Exemplu: 32. Suma si simplificarea a doua fracti.
1213
56
# include < iostream.h > struct fractie { long numitor, numarator; }; fractie f1, f2, s; long cmmdc(long x, long y) { long r; while( y > 0) { r = x % y; x = y; y = r; } }
void main() { cin >> f1.numarator >> f1.numitor; cin >> f2.numarator >> f2.numitor; s.numarator = f1.numarator*f2.numitor + f2.numarator*f1.numitor; s.numitor = f1.numitor*f2.numitor; long x = cmmdc(s.numarator,s.numitor); s.numarator /= x; s.numitor /= x; cout << s.numrator << " " << s.numitor; } Reviono la meniu ! Top ! 33. Lista dublu inlantuita. Se citesc din fişierul “lista.in” numere întregi de maxim 9
cifre, până la întâlnirea sfărşitului de fişier. Să se scrie un program care pune într-o lista dublu înlănţuită elementele nenule şi apoi sterge din listă elementele pare. Listele rezultate se va afişa în fişierul “lista.out”. Exemplu:
lista.in 12 0 3 1 4 0 11
lista.out 12 3 1 4 11 3 1 11
# include < iostream.h > # include < fstream.h > struct nod { long inf; nod *urm , * prec; }; nod *prim, *ultim; void adaugare_la_sfarsit(long x) { nod *aux = new nod; aux->inf = x; aux->urm = NULL; aux->prec = ultim; if( prim == NULL) prim = aux; else ultim->urm = aux; ultim = aux;
} void citire() { long x; ifstream fin("lista.in); while(fin >> x) if(x != 0) adaugare_la_sfarsit(x); fin.close(); } void sterge() { nod *c = prim; while(c) if( c->inf % 2 == 0) if( c == prim) { prim = prim->urm; prim->prec = NULL; delete(c); c = prim; } else { c->prec->urm = c->prec; c->urm->prec = c->prec; nod *aux = c; c= c->urm; delte(aux); } else c = c->urm; } void afisare() { for(nod *p = prim; p; p = p->urm) fout << p->inf << " "; } void main() { citire(); afisare(); sterge(); afisare(); fout.close(); }
Reviono la meniu ! Top ! 34. Permutari. Se citeşte de la tastatură un număr natural n (1≤n≤10). Să se afişeze în
fişierul “permut.out”, câte una pe linie, toate permutările numerelor de la 1 la n. Exemplu:
3
Permut.out 123 132 213 231 312 321
# include < iostream.h > # include < fstream.h > int n,x[11],sel[11]; ifstream fout("permut.out"); void afisare() { for(int i = 1;i <= n; ++i) fout << x[i] << " "; fout << endl; } void back(int k) { for(int i = 1; i <= n ; ++i) if(sel[i] == 0) { x[k] = i; sel[i] = 1; if(k == n) afisare(); else back(k+1); sel[i] = 0; } } void main() { cin >> n; back(1); fout.close();
} Reviono la meniu ! Top !
35. Aranjamente de n luate cate p. Se citesc de la tastatură două numere naturale n şi
p (1≤p≤n≤10). Să se afişeze în fişierul “aranj.out”, câte una pe linie, toate aranjamentele numerelor de la 1 la n, luate câte p. Exemplu:
32
aranj.out 12 13 21 23 31 32
# include < iostream.h > # include < fstream.h > int n,p,x[11],sel[11]; ifstream fout("aranj.out"); void afisare() { for(int i = 1;i <= p; ++i) fout << x[i] << " "; fout << endl; } void back(int k) { for(int i = 1; i <= n ; ++i) if(sel[i] == 0) { x[k] = i; sel[i] = 1; if(k == p) afisare(); else back(k+1); sel[i] = 0; } }
void main() { cin >> n >> p; back(1); fout.close(); }
Reviono la meniu ! Top !
36. Combinari de n luate cate p. Se citesc de la tastatură două numere naturale n şi p
(1≤p≤n≤10). Să se afişeze în fişierul “comb.out”, câte una pe linie, toate combinările numerelor de la 1 la n, luate câte p. Ex Reviono la meniu ! Top !emplu:
32
comb.out 12 13 23
# include < iostream.h > # include < fstream.h > int n,p,x[11]; ifstream fout("comb.out"); void afisare() { for(int i = 1;i <= p; ++i) fout << x[i] << " "; fout << endl; } void back(int k) { for(int i = x[k-1] + 1; i <= n-p+k ; ++i) { x[k] = i; if(k == p) afisare(); else back(k+1);
} } void main() { cin >> n >> p; back(1); fout.close(); } Reviono la meniu ! Top ! 37. Problema damelor . Se citeşte de la tastatură un număr natural n (1≤n≤10). Să se
afişeze în fişierul “dame.out” toate posibilităţile de aşezere a n dame pe tabla de şah, considerată de dimensiune n, astfel încât să nu se atace. Soluţiile vor fi afişate sub forma unor matrici pătratice de dimensiune n, în care fiecare dama e reprezentată printr-un ‘D’, iar pe poziţiile neocupate de dame apare caracterul ‘*’. Exemplu:
4
dame.out *D** ***D D*** **D* **D* D*** ***D *D**
# include < iostream.h > # include < fstream.h > # include < math.h > int n,x[11]; ifstream fout("dame.out"); void afisare() { for(int i = 1;i <= n; ++i) { for(int j = 1; j <= n; ++j) if( x[i] == j ) fout << "G"; else fout << "*";
fout << endl; } fout << endl; } int valid(int k) { for(int i = 1 ; i < k ; ++i) { if(x[i] == x[k]) return 0; if( k - i == abs(x[k]-x[i])) return 0; } return 1; } void back(int k) { for(int i = 1; i <= n ; ++i) { x[k] = i; if(valid(k)) if(k == n) afisare(); else back(k+1); } } void main() { cin >> n ; back(1); fout.close(); }
Reviono la meniu ! Top ! Se citeşte de la tastatură un număr natural n (1≤n≤10). Să se afişeze în fişierul “regi.out” toate posibilităţile de aşezere a n regi pe tabla de şah, considerată de dimensiune n, astfel încât să nu se atace şi să existe exact câte un rege pe fiecare linie. Soluţiile vor fi afişate sub forma unor matrici pătratice de dimensiune n, în care fiecare rege e reprezentat printr-un ‘R’, iar pe poziţiile neocupate de regi apare caracterul ‘*’. Exemplu: 38. Problema regilor .
3
regi.out
R** **R R** **R R** **R
# include < iostream.h > # include < fstream.h > # include < math.h > int n,x[11]; ifstream fout("regi.out"); void afisare() { for(int i = 1;i <= n; ++i) { for(int j = 1; j <= n; ++j) if( x[i] == j ) fout << "R"; else fout << "*"; fout << endl; } fout << endl; } void back(int k) { for(int i = 1; i <= n ; ++i) { x[k] = i; if(abs(x[k]-x[k-1])>1||k==1) if(k == n) afisare(); else back(k+1); } } void main() { cin >> n ; back(1); fout.close(); }
Reviono la meniu ! Top ! Se citesc de pe prima linie a fişierului “monede.in” două numere naturale s (de maxim 9 cifre) şi n (1≤n≤10) şi de pe următoarea linie se citeşte un şir de n numere naturale de maxim 5 cifre. Se cere să se afişeze în fişierul “monede.out” toate posibilităţile de plată a sumei s folosind n tipuri de monede ale căror valori sunt memorate în şirul citit. Exemplu: 39. Problema monedelor.
Monede.in 10 3 235
monede.out 10 = 5 de 2 10 = 2 de 2 si 2 de 3 10 = 1 de 2 si 1 de 3 si 1 de 5 10 = 2 de 5
# include < iostream.h > # include < fstream.h > # include < math.h > int n,a[11],x[11]; long s; ifstream fin("monede.in"); ofstream fout("monede.out"); void citire() { fin >> s >> n; for(int i = 1; i <= n; ++i) fin >> a[i]; fin.close(); } void afisare(int k) { fout << s << " = "; for(int i = 1;i < k; ++i) if( x[i] != 0) fout << x[i] << " de " << a[i] << " si "; fout << x[k] << " de " << a[k] << endl; } void back(int k) { for(int i = 0; i <= s/a[k] ; ++i) {
x[k] = i; sum += a[k] * i; if(sum == s) afisare(); else if(sum < s && k < n) back(k+1); sum -= a[k] * i; } } void main() { cin >> n ; back(1); fout.close(); } Se citesc de la tastatură două cuvinte de maxim 20 de litere. Să se scrie un program care verifică dacă unul este anagrama celuilalt. Un cuvânt este anagramă pentru altul dacă cele două cuvinte conţin aceleaşi litere de acelaşi număr de ori, dar nu neapărat în aceeaşi ordine. Exemplu: 40. Anagrame.
mare Da rame mare Nu mere
# include < iostream.h > # include < string.h > int frecva[100],frecvb[100]; char a[101],b[101]; void main() { cin >> a >> b ; for(int i = 0; i < strlen(a); ++i) frecva[a[i]-'a']++; for(int i = 0; i < strlen(b); ++i) frecvb[b[i]-'a']++; int ok =0; for(int i = 0 ; i < 32 ; ++ i) if(frecva[i] != frecvb[i]) ok = 1; if( ok == 0)