Sunteți pe pagina 1din 4

Algoritmi si structuri de date (18-19.10.

2012) Informatic, anul 1

ASD_L03

ALGORITMI ITERATIVI (cont.) R1. 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 condiie 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

Descrierea algoritmului n C++:


#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(); }

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


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

R2. 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). Descrierea algoritmului n pseudocod:
citeste n daca n%2 = 1 atunci *n este impar (restul imp. la 2 este 1) scrie nu se poate altfel *n este par pentru i = 1, n/2 ,2 repeta scrie i, n-i

Descrierea algoritmului n C++:


#include <conio.h> #include <iostream.h>

Algoritmi si structuri de date (18-19.10.2012) Informatic, anul 1

ASD_L03

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

R3. Enunul problemei: S se scrie un algoritm pentru a afia toate tripletele naturale (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

Descrierea algoritmului n 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++) 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)

Algoritmi si structuri de date (18-19.10.2012) Informatic, anul 1

ASD_L03

R4. 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: citeste n
pentru i = 1,n repeta *pentru linia i in general pentru j = 1,i repeta *se afiseaza componentele liniei i 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

Algoritmi si structuri de date (18-19.10.2012) Informatic, anul 1

ASD_L03

R5. Enunul problemei: S se scrie un algoritm pentru afiarea urmtoarea piramid de numere n n-1 n-2 1 .. i i-1 i-2 1 . 321 21 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: citeste n
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(); }

Tema 03 termen maxim 2 sptmni (se va transmite prin e-mail ntr-un fiier electronic sau personal pe foaie scris de mn sau listat cel trziu 2.11.2012): 1. S se afieze toate numerele de 2 cifre (ntre 10 i 99) care au cel puin o cifr de 5 i sunt divizibile cu 17 (observaie: nu avem date de intrare). Soluie: 51 i 85. 2. S se determine toate numerele naturale mai mici dect 2000, care mprite la 24, 30 respectiv 18 dau restul 7. Soluie: 7, 367, 727, 1087, 1447, 1807. 3. S se scrie n pseudocod (eventual i n C/C++) un algoritm pentru adugarea a nc dou cifre la dreapta numrului 1997 astfel ca numrul rezultat s fie divizibil cu 36. 4. S se scrie n pseudocod (eventual i n C/C++) un algoritm pentru determinarea tuturor numerelor a 23a care se mpart exact la 6. Soluie: 2232, 8238. Tem suplimentar: 5. S se gseasc un algoritm pentru determinarea numerelor pitagoreice mai mici sau egale ca n (adic determinai tripletele naturale (a, b, c) cu 1 a < b < c n i a2 + b2 = c2 celelalte nu mai sunt necesare datorit relaiei de ordine dintre a, b i c). 6. 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. 7. S se gseasc un algoritm pentru afiarea tuturor triunghiurilor (msurile laturilor) cu laturile numere naturale i de perimetru P dat. 4