Sunteți pe pagina 1din 5

Probleme C++ rezolvate (au fost discutate n pseudocod la laboratorul nr.3) R1.

Enunul problemei: S se determine un algoritm pentru a afia toate numerele de 2 cifre care adunate cu rsturnatul lor dau 55. De exemplu, 23 caci 23 + 32 = 55. Metoda de rezolvare: n primul rnd, numerele de 2 cifre sunt ntre 10 i 99. Dintre acestea vom afia doar pe cele cu proprietatea cerut. Rsturnatul unui numr n de 2 cifre se obine astfel: cifra unitilor * 10 + cifra zecilor, adic (restul mpririi lui n la 10) * 10 + (ctul mpririi lui n la 10) = n%10 * 10 + n / 10. Descrierea algoritmului n pseudocod:
pentru n = 10, 99 repeta *parcurgem toate nr de 2 cifre daca n + (n%10)*10 + n/10 = 55 atunci scrie n

Descrierea algoritmului n C++:

#include <conio.h> #include <iostream.h> void main() { int n; for (n=10; n<=99; n++) //nr de 2doua cifre if (n + n%10*10 + n/10 == 55) cout<<endl<<n; getch(); } 14 23 32 41 50

Dup rularea programului C++ (Ctrl+F9), pe ecran va apare, fiecare pe un rnd nou: Cteva explicaii cod C++: Linia int n; reprezint o declaraie a variabilei n, local n funcia main (i nu global, dup includerea bibliotecilor, efectul fiind ns acelai n acest program). L-am declarata stfel pentru c n ia valori ntre 10 i 99 i se ncadreaz n domeniul tipului de date int (-32768..32767, vezi 02 Tipuri de date in Borland C.doc): Apoi se parcurg cu n toate numerele de 2 cifre i dac numrul n + rsturnatul su (adic n%10 * 10 + n/10) face 55 atunci se afieaz pe rnd nou valoarea variabilei n. n cadrul expresiei n + n%10*10 + n/10 == 55, inem cont de ordinea operaiilor (vezi 03 Ordinea operatorilor n C++) i anume: *, / i % au aceeai prioritate (i se execut de la stnga la dreapta, apoi se execut adunarea i la final operaia de egalitate); aadar, operaiile din expresie se execut n ordinea urmtoare: %, *, /, + (cel din stnga), + (cel din dreapta), = =. Deci, nti se determin cifra unitilor, apoi aceasta se nmulete cu 10, se determin cifra zecilor, se adun n cu cifra unitilor * 10 i se adaug cifra zecilor, la final comparnduse rezultatul cu 55. Dac am fi avut nmulirea cu 10 la stnga (10*n%10) erau strict necesare paranteze pentru a se determian nti cifra unitilor => 10*(n%10). R2. Enunul problemei: S se scrie un algoritm pentru determnarea tuturor ptratelor perfecte mai mici sau egale cu n1 dat. Metoda de rezolvare: O metod ar fi s parcurgem toate numerele de la 1 la n i s testm dac acestea sunt ptrate perfecte sau nu. O alt metod: i=? astfel nct i2n lucru echivalent cu i=? astfel nct 1 i n , astfel c este suficient s parcurgem toate numerele naturale i ntre 1 i n i s afim i2. Descrierea algoritmului n pseudocod: citeste n *presupunem n1 pentru i=1, n ,1 repeta
scrie i2

Descrierea algoritmului n C++:


179451838.doc

1/5

#include <iostream.h> #include <conio.h> #include <math.h> //pt sqrt int n,i; void main() { cout<<endl<<"n="; cin>>n; cout<<"Patratele perfecte pana la n: "; for (int i=1;i<=sqrt(n);i++) cout<<i*i<<" "; getch(); }

Dup rularea programului C++ (Ctrl+F9), pe ecran va apare:


n = 10 <Enter> Patratele perfecte pana la n: 1 4 9

sau

n = 16 <Enter> Patratele perfecte pana la n: 1 4 9 16

R3. Enunul problemei: S se scrie un algoritm pentru a afia toate perechile de numere naturale (a, b) astfel nct a + b=1000, 17 / a i 19 / b. Metoda de rezolvare: La prima vedere, ne putem gndi la dou for-uri, unul pentru a i unul pentru b i punnd apoi cele trei condiii. Dar innd cont c a+b=100, se poate exprima b n funcie de a (b=1000-a) i astfel nu mai este necesar dect un singur for, cel dup a. Cum cutm a multiplu de 17, putem parcurge cu a de la 17, din 17 n 17, pn la 1000 (fr s calculm care este cel mai mare mutiplu de 17 < 1000). Singura conditie care se va mai impune n for va fi 19 / b, adic (1000-a) % 19=0. Descrierea algoritmului n pseudocod:
pentru a = 17,1000,17 repeta *multiplii de 17 pana la 1000 daca (1000-a)%19 = 0 atunci scrie a, 1000-a #include <conio.h> #include <iostream.h> void main() { int a; for (a=17;a<=1000;a+=17) if ((1000-a)%19 == 0) cout<<endl<<"("<<a<<","<<1000-a<<")"; getch(); }

Descrierea algoritmului n C++:

Dup rularea programului C++ (Ctrl+F9), pe ecran va apare:


(221,779) (544,456) (867,133)

R4. Enunul problemei: S se scrie un algoritm pentru a scrie un numr dat ca sum de dou numere impare (toate posibilitile), dac se poate. De exemplu, n = 33 nu se poate scrie ca sum de dou numere impare, iar n = 24 = 1+23 = 3+21 = 5+19 = 7+17 = 9+15 = 11+13. Metoda de rezolvare: Se observ c pentru numr impar nu se poate scrie ca sum de dou numere impare i c orice numr par se poate scrie ca cel puin o sum dintre dou numere impare. n cazul unui numr par, putem parcurge cu un i toate numerele impare de la 1 la n/2 (pentru a nu mai scrie i simetricele), scriind n ca sum ntre i i n-i (n fiind par i i impar, rezult c n-i este de asemenea impar i nu mai necesit verificarea condiiei de imparitate).
179451838.doc

2/5

Descrierea algoritmului n pseudocod:


citeste n daca n%2 == 1 atunci scrie nu se poate altfel pentru i = 1, n/2 ,2 repeta scrie i, n-i

Descrierea algoritmului n C++:


#include <conio.h> #include <iostream.h> void main() { int n,i; cout<<endl<<"n="; cin>>n; if (n%2==1) //sau (n%2) cout<<"Nu se poate"; else for (i=1;i<=n/2;i+=2) cout<<n<<" = "<<i<<" + "<<n-i<<endl; getch(); }

Dup rularea programului C++ (Ctrl+F9), pe ecran va apare:


n = 33 <Enter> Nu se poate

sau
n = 24 <Enter> 24 = 1 + 23 24 = 3 + 21 24 = 5 + 19 24 = 7 + 17 24 = 9 + 15 24 = 11 + 13

R5. Enunul problemei: S se scrie un algoritm pentru a afia toate tripletele ( a, b, c) astfel nct 1 a < b < c 10, cu a + b + c divizibil cu 10. Metoda de rezolvare: De data aceasta sunt necesare trei for-uri, pentru c cele 3 variabile, a, b, c nu mai sunt legate printr-o relaie de egalitate i astfel una dintre variabile nu mai poate fi scris n funcie de celelalte. Valoare minim a variabilei a este 1, valoarea minim a lui b pentru un a dat este a+1 (a<b), iar valoarea minim a lui c pentru un b dat este b+1 (b<c). Apoi, valoarea maxim a lui c este 10, valoarea maxim a lui b este 9 (b<c) i valoarea maxim a lui a este 8 (a<b). Descrierea algoritmului n pseudocod:
pentru a = 1,8 repeta pentru b = a+1,9 repeta pentru c = b+1,10 repeta daca (a+b+c)%10 == 0 atunci scrie a,b,c #include <conio.h> #include <iostream.h> void main() { int a,b,c; for (a=1;a<=8;a++) for (b=a+1;b<=9;b++)

Descrierea algoritmului n C++:

179451838.doc

3/5

for (c=b+1;c<=10;c++) if ((a+b+c)%10==0) cout<<endl<<"("<<a<<","<<b<<","<<c<<")"; getch(); }

Dup rularea programului C++ (Ctrl+F9), pe ecran va apare fiecare triplet pe rnd nou:

(1,2,7) (1,3,6) (1,4,5) (1,9,10) (2,3,5) (2,8,10) (3,7,10) (3,8,9) (4,6,10) (4,7,9) (5,6,9) (5,7,8)

R6. Enunul problemei: S se scrie un algoritm pentru afiarea urmtoarea piramid de numere 1 12 123 123n pentru un n1 dat. Metoda de rezolvare: Piramida poate fi vzut ca o matrice, cu n linii i pe linia i fiind i elemente i anume: 1, 2,..., j , ...i (i = 1, 2,..., n). Descrierea algoritmului n pseudocod:
pentru i = 1,n repeta pentru j = 1,i repeta scrie j *se trece pe randul urmator (la urmatoarea linie)

Descrierea algoritmului n C++:

#include <conio.h> #include <iomanip.h> //pt setw #include <iostream.h> void main() { int n,i,j; cout<<endl<<"n="; cin>>n; for (i=1;i<=n;i++) { for (j=1;j<=i;j++) cout<<setw(3)<<j; cout<<endl; } getch(); }

Cteva explicaii cod C++: Afiarea valorii j se face pe 3 cmpuri (caractere), valoarea afiat ocupndu-le de la dreapta la stnga (astfel vor apare coloanele frumos aliniate) i eventualele spaii rmnnd libere la stnga valorii lui j. De aceea se folosete setw care este declarat n fiierul header iomanip. Dac am fi afiat valoarea lui i n loc de valoarea lui j, piramida ar fi fost: 1 22 333 . nnn n R7.
179451838.doc

4/5

Enunul problemei: S se scrie un algoritm pentru afiarea urmtoarea piramid de numere n-1 n-2 1 .. 123 12 1 (pentru un n1 dat). Metoda de rezolvare: Algoritmul este similar cu cel anterior doar c indicele liniei se poate considera de n napoi la 1, iar pentru o linie i n general, j se ia de la i napoi la 1. Descrierea algoritmului n pseudocod:
pentru i = n,1,-1 repeta pentru j = i,1,-1 repeta scrie j *se trece pe randul urmator (la urmatoarea linie)

Descrierea algoritmului n C++:


#include <conio.h> #include <iomanip.h> //pt setw #include <iostream.h> void main() { int n,i,j; cout<<endl<<"n="; cin>>n; for (i=n;i>=1;i--) { for (j=i;j>=1;j--) cout<<setw(3)<<j; cout<<endl; } getch(); }

Tem suplimentar: 1. S se gseasc un algoritm pentru determinarea numerelor pitagoreice mai mici sau egale ca n (adic determinai tripletele naturale (a, b, c) cu 1a<b<cn i a2 + b2 = c2 celelalte nu mai sunt necesare datorit relaiei de ordine dintre a, b i c). 2. S se gseasc un algoritm pentru afiarea tuturor numerelor dintre 100 i 599 ce au cifrele n ordine cresctoare i suma cifrelor egal cu 18. 3. S se gseasc un algoritm pentru afiarea tuturor triunghiurilor cu laturile numere naturale i de perimetru p dat.

179451838.doc

5/5