algoritmi si structuri de date.pdf
TRANSCRIPT
-
7/25/2019 Algoritmi si structuri de date.pdf
1/402
ALGORITMI SI STRUCTURI DE DATE 1
Note de Laborator
(uz intern - draft v1.8)
Adrian Rabaea
-
7/25/2019 Algoritmi si structuri de date.pdf
2/402
-
7/25/2019 Algoritmi si structuri de date.pdf
3/402
Cuprins
1 Exercitii simple 11.1 Algoritmi elementari . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.1.1 Acest numar este prim? . . . . . . . . . . . . . . . . . . . . 11.1.2 Lista numerelor prime . . . . . . . . . . . . . . . . . . . . . 21.1.3 Descompunere n factori primi . . . . . . . . . . . . . . . . 21.1.4 Cel mai mare divizor comun . . . . . . . . . . . . . . . . . . 31.1.5 Cel mai mic multiplu comun . . . . . . . . . . . . . . . . . 41.1.6 Cel mai mic multiplu comun, optimizat . . . . . . . . . . . 51.1.7 Calculul puterilor . . . . . . . . . . . . . . . . . . . . . . . . 71.1.8 Calculul puterilor, optimizat . . . . . . . . . . . . . . . . . 71.1.9 Calculul factorialului . . . . . . . . . . . . . . . . . . . . . . 81.1.10 Calculul combinarilor . . . . . . . . . . . . . . . . . . . . . 81.1.11 Numarul lui Catalan Cn=
1n+1
Cn2n . . . . . . . . . . . . . . 101.1.12 Produsul a doua polinoame . . . . . . . . . . . . . . . . . . 11
1.1.13 Schema lui Horner . . . . . . . . . . . . . . . . . . . . . . . 121.1.14 Calculul valorii unui polinom . . . . . . . . . . . . . . . . . 131.1.15 Puterea unui polinom . . . . . . . . . . . . . . . . . . . . . 131.1.16 Derivata unui polinom . . . . . . . . . . . . . . . . . . . . . 141.1.17 Derivata de ordinulk a unui polinom . . . . . . . . . . . . . 151.1.18 Derivata de ordinulk a functiei f(x) =Pn(x)ex . . . . . . 161.1.19 Ordinul unei permutari . . . . . . . . . . . . . . . . . . . . 171.1.20 Suma puterilor radacinilor ecuatiei de grad 2 . . . . . . . . 191.1.21 Suma puterilor radacinilor ecuatiei de grad 3 . . . . . . . . 191.1.22 Sirul lui Fibonacci si proportia de aur . . . . . . . . . . . 201.1.23 Descompunere Fibonacci . . . . . . . . . . . . . . . . . . . 211.1.24 Numarul permutarilor idempotente . . . . . . . . . . . . . . 221.1.25 Fractie continua: determinarea coeficientilor . . . . . . . . . 22
1.1.26 Fractie continua: determinarea fractiei initiale . . . . . . . . 231.1.27 Generare polinom cu radacini fractionare date . . . . . . . 241.1.28 Radacini rationale . . . . . . . . . . . . . . . . . . . . . . . 251.1.29 Numarul divizorilor unui numar natural . . . . . . . . . . . 261.1.30 Functia lui Euler . . . . . . . . . . . . . . . . . . . . . . . . 27
iii
-
7/25/2019 Algoritmi si structuri de date.pdf
4/402
-
7/25/2019 Algoritmi si structuri de date.pdf
5/402
2.2.7 Numerele lui Bell cu numere mari . . . . . . . . . . . . . . 84
2.2.8 Partitiile unui numar natural cu numere mari . . . . . . . . 882.2.9 Recurenta Catalan Cn =n
k=1 Ck1Cnk unde C0 = 1, cunumere mari . . . . . . . . . . . . . . . . . . . . . . . . . . 90
2.2.10 Recurenta: En = E2En1+E3En2+ ... + En1E2 undeE1= E2= 1 cu numere mari . . . . . . . . . . . . . . . . . 93
2.2.11 Calcul f(n) =n
k=0 CknFk cu numere mari . . . . . . . . . 96
2.2.12 Calcul f(n) =n
k=0 Ckn2
kFk cu numere mari . . . . . . . . 99
2.2.13 Fractie continua: determinarea fractiei initiale cu numere mari103
2.2.14 Numarul permutarilor idempotente, cu numere mari . . . . 105
3 OJI 2002 clasa a IX-a 109
3.1 Poarta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
3.1.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 1103.1.2 Rezolvare detaliata . . . . . . . . . . . . . . . . . . . . . . . 110
3.1.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 110
3.2 Mouse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
3.2.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 113
3.2.2 Rezolvare detaliata . . . . . . . . . . . . . . . . . . . . . . . 113
3.2.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 113
4 OJI 2003 clasa a IX-a 117
4.1 Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
4.1.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 118
4.1.2 Rezolvare detaliata * . . . . . . . . . . . . . . . . . . . . . . 1194.1.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 119
4.2 Numere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
4.2.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 122
4.2.2 Rezolvare detaliata . . . . . . . . . . . . . . . . . . . . . . . 122
4.2.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 122
5 OJI 2004 clasa a IX-a 125
5.1 Expresie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
5.1.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 126
5.1.2 Rezolvare detaliata . . . . . . . . . . . . . . . . . . . . . . . 127
5.1.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 1275.2 Reactivi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
5.2.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 133
5.2.2 Rezolvare detaliata . . . . . . . . . . . . . . . . . . . . . . . 134
5.2.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 134
-
7/25/2019 Algoritmi si structuri de date.pdf
6/402
6 OJI 2005 clasa a IX-a 1376.1 Numere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
6.1.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 1386.1.2 Rezolvare detaliata . . . . . . . . . . . . . . . . . . . . . . . 1386.1.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 138
6.2 MaxD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1396.2.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 1406.2.2 Rezolvare detaliata . . . . . . . . . . . . . . . . . . . . . . . 1416.2.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 141
7 OJI 2006 clasa a IX-a 1457.1 Flori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
7.1.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 1467.1.2 Rezolvare detaliata . . . . . . . . . . . . . . . . . . . . . . . 147
7.1.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 1477.2 Pluton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
7.2.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 1517.2.2 Rezolvare detaliata . . . . . . . . . . . . . . . . . . . . . . . 1527.2.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 152
8 ONI 2000 clasa a IX-a 1578.1 Algoritm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
8.1.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 1608.1.2 Rezolvare detaliata * . . . . . . . . . . . . . . . . . . . . . . 1608.1.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 162
8.2 Cod de identificare . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
8.2.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 1658.2.2 Rezolvare detaliata * . . . . . . . . . . . . . . . . . . . . . . 1658.2.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 168
8.3 Comoara . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1698.3.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 1708.3.2 Rezolvare detaliata . . . . . . . . . . . . . . . . . . . . . . . 1718.3.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 171
8.4 Cuburi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1738.4.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 1758.4.2 Rezolvare detaliata . . . . . . . . . . . . . . . . . . . . . . . 1758.4.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 175
8.5 Fibo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1778.5.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 178
8.5.2 Rezolvare detaliata . . . . . . . . . . . . . . . . . . . . . . . 1788.5.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 178
8.6 Kommando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1818.6.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 1838.6.2 Rezolvare detaliata . . . . . . . . . . . . . . . . . . . . . . . 183
-
7/25/2019 Algoritmi si structuri de date.pdf
7/402
8.6.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 183
9 ONI 2001 clasa a IX-a 1959.1 Ferma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
9.1.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 1969.1.2 Rezolvare detaliata * . . . . . . . . . . . . . . . . . . . . . . 1979.1.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 198
9.2 Fractii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2009.2.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 2009.2.2 Rezolvare detaliata . . . . . . . . . . . . . . . . . . . . . . . 2019.2.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 201
9.3 Tablou . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2029.3.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 2029.3.2 Rezolvare detaliata * . . . . . . . . . . . . . . . . . . . . . . 203
9.3.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 2049.4 Competitie dificila . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
9.4.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 2069.4.2 Rezolvare detaliata . . . . . . . . . . . . . . . . . . . . . . . 2069.4.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 206
9.5 Cuvinte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2089.5.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 2099.5.2 Rezolvare detaliata . . . . . . . . . . . . . . . . . . . . . . . 2099.5.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 209
9.6 Grup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2119.6.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 2129.6.2 Rezolvare detaliata . . . . . . . . . . . . . . . . . . . . . . . 213
9.6.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 213
10 ONI 2002 clasa a IX-a 21510.1 Pentagon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
10.1.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 21610.1.2 Rezolvare detaliata . . . . . . . . . . . . . . . . . . . . . . . 21710.1.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 217
10.2 Pod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21810.2.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 21910.2.2 Rezolvare detaliata * . . . . . . . . . . . . . . . . . . . . . . 22110.2.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 225
10.3 Suma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22910.3.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 230
10.3.2 Rezolvare detaliata . . . . . . . . . . . . . . . . . . . . . . . 23110.3.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 231
10.4 Becuri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23210.4.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 23310.4.2 Rezolvare detaliata * . . . . . . . . . . . . . . . . . . . . . . 233
-
7/25/2019 Algoritmi si structuri de date.pdf
8/402
10.4.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 23810.5 D iscuri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
10.5.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 24310.5.2 Rezolvare detaliata . . . . . . . . . . . . . . . . . . . . . . . 24410.5.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 244
10.6 Cod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24610.6.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 24710.6.2 Rezolvare detaliata . . . . . . . . . . . . . . . . . . . . . . . 24810.6.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 248
11 ONI 2003 clasa a IX-a 25111.1 Seti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251
11.1.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 25211.1.2 Rezolvare detaliata . . . . . . . . . . . . . . . . . . . . . . . 252
11.1.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 25211.2 S caune . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
11.2.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 25711.2.2 Rezolvare detaliata . . . . . . . . . . . . . . . . . . . . . . . 25811.2.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 258
11.3 C ircular . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26111.3.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 26211.3.2 Rezolvare detaliata . . . . . . . . . . . . . . . . . . . . . . . 26311.3.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 263
11.4 C riptare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26611.4.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 26811.4.2 Rezolvare detaliata . . . . . . . . . . . . . . . . . . . . . . . 268
11.4.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 27011.5 M asina . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27111.5.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 27211.5.2 Rezolvare detaliata . . . . . . . . . . . . . . . . . . . . . . . 27311.5.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 273
11.6 Operatii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27411.6.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 27511.6.2 Rezolvare detaliata . . . . . . . . . . . . . . . . . . . . . . . 27611.6.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 276
12 ONI 2004 clasa a IX-a 27912.1 C oduri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
12.1.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 280
12.1.2 Rezolvare detaliata * . . . . . . . . . . . . . . . . . . . . . . 28012.1.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 281
12.2 L ogic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28112.2.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 28312.2.2 Rezolvare detaliata * . . . . . . . . . . . . . . . . . . . . . . 283
-
7/25/2019 Algoritmi si structuri de date.pdf
9/402
12.2.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 28712.3 Poligon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
12.3.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 29012.3.2 Rezolvare detaliata . . . . . . . . . . . . . . . . . . . . . . 29112.3.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 291
12.4 S ablon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29512.4.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 29612.4.2 Rezolvare detaliata * . . . . . . . . . . . . . . . . . . . . . . 29712.4.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 297
12.5 S ir . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29912.5.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 30012.5.2 Rezolvare detaliata . . . . . . . . . . . . . . . . . . . . . . . 30012.5.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 300
12.6 Snipers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30112.6.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 30212.6.2 Rezolvare detaliata . . . . . . . . . . . . . . . . . . . . . . . 30312.6.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 303
13 ONI 2005 clasa a IX-a 30713.1 Bifo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307
13.1.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 30813.1.2 Rezolvare detaliata . . . . . . . . . . . . . . . . . . . . . . . 30913.1.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 311
13.2 Romeo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31713.2.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 31913.2.2 Rezolvare detaliata * . . . . . . . . . . . . . . . . . . . . . . 321
13.2.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 32113.3 Seceta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322
13.3.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 32313.3.2 Rezolvare detaliata . . . . . . . . . . . . . . . . . . . . . . . 32313.3.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 323
13.4 Biblos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33513.4.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 33613.4.2 Rezolvare detaliata . . . . . . . . . . . . . . . . . . . . . . . 33713.4.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 337
13.5 Joc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34013.5.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 34213.5.2 Rezolvare detaliata . . . . . . . . . . . . . . . . . . . . . . . 344
13.5.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 34413.6 Pal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
13.6.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 35113.6.2 Rezolvare detaliata . . . . . . . . . . . . . . . . . . . . . . . 35213.6.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 352
-
7/25/2019 Algoritmi si structuri de date.pdf
10/402
x
14 ONI 2006 clasa a IX-a 35714.1 Factorial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357
14.1.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 35814.1.2 Rezolvare detaliata . . . . . . . . . . . . . . . . . . . . . . . 35814.1.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 358
14.2 L imba j . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36014.2.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 36114.2.2 Rezolvare detaliata . . . . . . . . . . . . . . . . . . . . . . . 36214.2.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 362
14.3 Panouri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36814.3.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 36914.3.2 Rezolvare detaliata . . . . . . . . . . . . . . . . . . . . . . . 37014.3.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 370
14.4 Pereti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374
14.4.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 37514.4.2 Rezolvare detaliata . . . . . . . . . . . . . . . . . . . . . . . 37514.4.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 375
14.5 Sant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37714.5.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 37914.5.2 Rezolvare detaliata . . . . . . . . . . . . . . . . . . . . . . . 37914.5.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 379
14.6 Zumzi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38114.6.1 Indicatii de rezolvare * . . . . . . . . . . . . . . . . . . . . . 38314.6.2 Rezolvare detaliata . . . . . . . . . . . . . . . . . . . . . . . 38414.6.3 Codul sursa * . . . . . . . . . . . . . . . . . . . . . . . . . . 385
-
7/25/2019 Algoritmi si structuri de date.pdf
11/402
Capitolul 1
Exercitii simple
1.1 Algoritmi elementari
1.1.1 Acest numar este prim?
import java.io.*;
class nrPrim {
public static void main (String[]args) throws IOException {long x;
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in));
System.out.print("x = "); x=Long.parseLong(br.readLine());
if(estePrim(x)) System.out.println(x+" este PRIM");
else System.out.println(x+" NU este PRIM");
}
static boolean estePrim(long nr) {
if((nr==0)||(nr==1)) return false;
if((nr==2)||(nr==3)) return true;
if(nr%2==0) return false;
long d=3;while((nr%d!=0)&&(d*d
-
7/25/2019 Algoritmi si structuri de date.pdf
12/402
2 CAPITOLUL 1. EXERCITII SIMPLE
1.1.2 Lista numerelor prime
import java.io.*;
class NumerePrimeLista
{
public static void main(String[]args)throws IOException
{
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
int n;
System.out.println("Dim. lista:"); n=Integer.parseInt(stdin.readLine());
int[] prim=new int[n];
prim[0]=2;
prim[1]=3;
int k=1; // pozitia in lista a ultimului numar prim plasat
int nr=5; // nr este urmatorul numar prim ?
int j,primj;// parcurg lista
while(k
-
7/25/2019 Algoritmi si structuri de date.pdf
13/402
1.1. ALGORITMI ELEMENTARI 3
static void descFact(long nr)
{
long d=2;
if((nr==0)||(nr==1))
{
System.out.println(nr);
return;
}
while(nr%d==0)
{
System.out.print(d+" ");
nr=nr/d;
}
d=3;while((d*d
-
7/25/2019 Algoritmi si structuri de date.pdf
14/402
4 CAPITOLUL 1. EXERCITII SIMPLE
}
static long cmmdc(long a, long b)
{
long d,i,c,r;
if (a>b) {d=a; i=b;} else {d=b; i=a;}
while (i != 0)
{
c=d/i; // nu se foloseste !
r=d%i;
d=i;
i=r;
}
return d;
}}
1.1.5 Cel mai mic multiplu comun
import java.io.*;
class Cmmmc1
{
public static void main (String[]args) throws IOException
{
long x,y;BufferedReader br = new BufferedReader(
new InputStreamReader(System.in));
System.out.print("x = "); x=Long.parseLong(br.readLine());
System.out.print("y = "); y=Long.parseLong(br.readLine());
System.out.println("cmmmc("+x+","+y+") = "+cmmmc(x,y));
}
static long cmmmc(long a, long b)
{
int d;
int nrda,nrdb;
long p,pa,pb;
p=1;
d=2;
nrda=0; pa=1;
while(a%d==0) { nrda++; pa=pa*d; a=a/d;}
-
7/25/2019 Algoritmi si structuri de date.pdf
15/402
1.1. ALGORITMI ELEMENTARI 5
nrdb=0; pb=1;
while(b%d==0) { nrdb++; pb=pb*d; b=b/d;}
if(pa+pb>0)
if(pa>pb) p=p*pa; else p=p*pb;
d=3;
while((d*dpb) p=p*pa; else p=p*pb;
d=d+2;}
System.out.println("p="+p+" si A RAMAS a="+a+" b="+b);
if(a==b) p=p*a; // ex: a=2*17 b=3*17
else p=p*a*b; // ex: a=2*3 b=2*5
return p;
}
}
1.1.6 Cel mai mic multiplu comun, optimizat
import java.io.*;
class Cmmmc2
{
public static void main (String[]args) throws IOException
{
long x,y;
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in));
System.out.print("x = "); x=Long.parseLong(br.readLine());
System.out.print("y = "); y=Long.parseLong(br.readLine());
// x=2*2*2;
// y=2*3*3*3*3;
System.out.println("cmmmc("+x+","+y+") = "+cmmmc(x,y));}
static long cmmmc(long a, long b)
{
-
7/25/2019 Algoritmi si structuri de date.pdf
16/402
6 CAPITOLUL 1. EXERCITII SIMPLE
int d;
int nrda,nrdb;
long p,pa,pb,maxab, minab;
p=1;
d=2;
nrda=0; pa=1;
while(a%d==0) { nrda++; pa=pa*d; a=a/d;}
nrdb=0; pb=1;
while(b%d==0) { nrdb++; pb=pb*d; b=b/d;}
if(pa+pb>0)
if(pa>pb) p=p*pa; else p=p*pb;
d=3;
while((d*dpb) p=p*pa; else p=p*pb;
d=d+2;// ex: a=2*3 b=2*9 ???
}
// System.out.println("Ultimul divizor incercat este d="+max(2,(d-2)));
// System.out.println("p="+p+" si A RAMAS a="+a+" b="+b);
maxab=max(a,b);minab=min(a,b);
if(maxab>1) // a ramas ceva in a sau b
if(a==b) p=p*a; // ex: a=2*17 b=3*17
else if(maxab%minab!=0) p=p*a*b; // ex: a=2*3 b=2*5
else// ex: a=2*3 b=2*9
{
p=p*minab;
a=a/minab;
b=b/minab;
p=p*a*b; // cel mai mic este 1
}
return p;
}
static long max(long a, long b) { if(a>b) return a; else return b; }
static long min(long a, long b) { if(a
-
7/25/2019 Algoritmi si structuri de date.pdf
17/402
1.1. ALGORITMI ELEMENTARI 7
1.1.7 Calculul puterilor
import java.io.*;
class Putere
{
public static void main (String[]args) throws IOException
{
int a,n;
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in));
System.out.print("a = "); a=Integer.parseInt(br.readLine());
System.out.print("n = "); n=Integer.parseInt(br.readLine());
System.out.println("putere("+a+","+n+") = "+putere(a,n));
}
static long putere(int a,int n)
{
int k;
long p;
p=1;
for(k=1;k
-
7/25/2019 Algoritmi si structuri de date.pdf
18/402
8 CAPITOLUL 1. EXERCITII SIMPLE
{
int k;
long p, a2k;
p=1;
a2k=a;
while(n!=0)
{
if(n%2==1) p=p*a2k;
a2k=a2k*a2k;
n=n/2;
}
return p;
}
}
1.1.9 Calculul factorialului
import java.io.*;
class Factorial
{
public static void main (String[]args) throws IOException
{
int n;
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in));System.out.print("n = "); n=Integer.parseInt(br.readLine());
System.out.println(n+"! = "+factorial(n));
}
static long factorial(int n)
{
int k;
long p;
p=1;
for(k=1;k
-
7/25/2019 Algoritmi si structuri de date.pdf
19/402
1.1. ALGORITMI ELEMENTARI 9
import java.io.*;
class Combinari
{
public static void main (String[]args) throws IOException
{
int n,k;
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in));
System.out.print("n = "); n=Integer.parseInt(br.readLine());
System.out.print("k = "); k=Integer.parseInt(br.readLine());
System.out.println("combinari("+n+","+k+") = "+comb(n,k));
}
static long comb(int n,int k)
{int i,j,d;
if(k>n/2) k=n-k; // o mica optimizare !
int[] x=new int[k+1];
int[] y=new int[k+1];
for(i=1;i
-
7/25/2019 Algoritmi si structuri de date.pdf
20/402
10 CAPITOLUL 1. EXERCITII SIMPLE
}
return d;
}
}
1.1.11 Numarul lui Catalan Cn= 1n+1
Cn2n
import java.io.*;
class Catalan
{
public static void main (String[]args) throws IOException
{
int n,k;BufferedReader br = new BufferedReader(
new InputStreamReader(System.in));
System.out.print("n = "); n=Integer.parseInt(br.readLine());
System.out.println("catalan("+n+") = "+catalan(n));
}
static long catalan(int n)
{
int i,j,d;
int[] x=new int[n+1];
int[] y=new int[n+1];
for(i=2;i
-
7/25/2019 Algoritmi si structuri de date.pdf
21/402
1.1. ALGORITMI ELEMENTARI 11
if(a>b) {d=a; i=b;} else {d=b; i=a;}
while (i != 0)
{
c=d/i; // nu se foloseste !
r=d%i;
d=i;
i=r;
}
return d;
}
}
1.1.12 Produsul a doua polinoame
class ProdusPolinoame
{
public static void main(String[] args)
{
int gradp=1;
int gradq=2;
int[] p=new int[gradp+1];
int[] q=new int[gradq+1];
p[gradp]=1;
p[0]=1;afisv("p = ",p);
q[gradq]=1;
q[1]=2;
q[0]=1;
afisv("q = ",q);
int[] pq=prodPol(p,q);
afisv("p * q = ",pq);
}
static int[] prodPol(int[] a, int[] b)
{int i,j;
int na=a.length-1;
int nb=b.length-1;
int nc=na+nb;
-
7/25/2019 Algoritmi si structuri de date.pdf
22/402
12 CAPITOLUL 1. EXERCITII SIMPLE
int[] c=new int[nc+1];
for(i=0;i=0;i--)
{
System.out.print("p["+i+"]=");
p[i]=Integer.parseInt(br.readLine());
}
System.out.print("a = ");
int a=Integer.parseInt(br.readLine());
int[] q=new int[n+1];
q[n]=p[n];for(int k=n-1;k>=0;k--) q[k]=q[k+1]*a+p[k];
for(int k=n;k>0;k--) System.out.print(q[k]+" ");
System.out.println("\n"+"r="+q[0]);
-
7/25/2019 Algoritmi si structuri de date.pdf
23/402
1.1. ALGORITMI ELEMENTARI 13
}// main
}// class
1.1.14 Calculul valorii unui polinom
import java.io.*; // in schema lui Horner restul=r=p(a)
class ValoarePolinom
{
public static void main(String[] args) throws IOException
{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
System.out.print("Gradul polinomului P(X): ");
int n=Integer.parseInt(br.readLine());int[] p=new int[n+1];
for(int i=n;i>=0;i--)
{
System.out.print("p["+i+"]=");
p[i]=Integer.parseInt(br.readLine());
}
System.out.print("a = ");
int a=Integer.parseInt(br.readLine());
int r=p[n];
for(int k=n-1;k>=0;k--) r=r*a+p[k];
System.out.println("p("+a+")="+r);
}
}
1.1.15 Puterea unui polinom
class PuterePolinom
{
public static void main(String[] args)
{
int gradp=1; // gradul polinomului p
int m=15; // puterea la care se ridica polinomul p
int k;
int[] p=new int[gradp+1];
int[] pk={1};
p[gradp]=1;
-
7/25/2019 Algoritmi si structuri de date.pdf
24/402
14 CAPITOLUL 1. EXERCITII SIMPLE
p[0]=1;
afisv("p^"+0+" = ",pk);
for(k=1;k
-
7/25/2019 Algoritmi si structuri de date.pdf
25/402
1.1. ALGORITMI ELEMENTARI 15
p[gradp]=2;
p[2]=3;
p[1]=4;
p[0]=5;
afisv("p = ",p);
afisv("p = ",derivPol(p));
}
static int[] derivPol(int[] a)
{
int i,j;
int na=a.length-1; // gradul polinomului
int nb=na-1; // gradul derivatei
int[] b=new int[nb+1];for(i=1;i=0;i--) System.out.print(x[i]+" ");
System.out.println();}
}
1.1.17 Derivata de ordinul k a unui polinom
class Derivata_kPolinom
{
public static void main(String[] args)
{
int gradp=3; // gradul polinomului p
int[] p=new int[gradp+1];int k=3; // ordinul derivatei
p[gradp]=2;
p[2]=3;
p[1]=4;
-
7/25/2019 Algoritmi si structuri de date.pdf
26/402
16 CAPITOLUL 1. EXERCITII SIMPLE
p[0]=5;
afisv("p = ",p);
int[] pk=p;
afisv("p^("+0+") = ",pk);
for(int i=1;i
-
7/25/2019 Algoritmi si structuri de date.pdf
27/402
1.1. ALGORITMI ELEMENTARI 17
p[gradp]=1;
p[0]=0;
afisv("p = ",p);
long[] pk=p;
afisv("f^("+0+") ==> q = ",pk);
for(int i=1;i
-
7/25/2019 Algoritmi si structuri de date.pdf
28/402
18 CAPITOLUL 1. EXERCITII SIMPLE
{
int r,i;
StreamTokenizer st = new StreamTokenizer(new BufferedReader(
new FileReader("permutare.in")));
PrintWriter out = new PrintWriter(new BufferedWriter(
new FileWriter("permutare.out")));
st.nextToken();n=(int)st.nval;
p=new int[n+1];
pr=new int[n+1];
for(i=1;i
-
7/25/2019 Algoritmi si structuri de date.pdf
29/402
1.1. ALGORITMI ELEMENTARI 19
}
return ok;
}
}
1.1.20 Suma puterilor radacinilor ecuatiei de grad 2
class SnEc2
{
public static void main(String[] args)
{
int a,b,c;
int n=10;int s,p;
a=1;
b=1;
c = 2 ; / / 1 1 2 = = > x ^ 2 + x + 1 = 0
s=-b/a;
p=c/a;
long[] ss=new long[n+1];
ss[1]=s;
ss[2]=s*s-2*p;
int k;
for(k=3;k
-
7/25/2019 Algoritmi si structuri de date.pdf
30/402
20 CAPITOLUL 1. EXERCITII SIMPLE
c=11;
d=-6; // ==> x^3-6x^2+11x-6=0 ==> 1, 2, 3
s1=-b/a;
s2=c/a;
s3=-d/a;
s[0]=3;
s[1]=s1;
s[2]=s1*s1-2*s2;
System.out.println("s1="+s1+" s2="+s2+" s3="+s3);
for(k=3;k
-
7/25/2019 Algoritmi si structuri de date.pdf
31/402
1.1. ALGORITMI ELEMENTARI 21
}
1.1.23 Descompunere Fibonacci
import java.io.*;
class DescompunereFibonacci
{
static int n=92; // cel mai mare numar Fibonacci care incape pe LONG!
static long[] f=new long[n+1];
public static void main (String[]args) throws IOException
{
long x; // x=1234567890123456789L; cel mult!BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
System.out.print("x = ");
x=Long.parseLong(br.readLine());
long y;
int iy;
int k;
int nrt=0;
f[0]=0;
f[1]=1;
f[2]=1;
for(k=3;k
-
7/25/2019 Algoritmi si structuri de date.pdf
32/402
22 CAPITOLUL 1. EXERCITII SIMPLE
}
}
1.1.24 Numarul permutarilor idempotente
import java.io.*; // numarul permutarilor idempotente p^2 = e in S_n
class PermIdempotente
{
static int n;
public static void main(String[] args) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("n = "); n = Integer.parseInt(br.readLine());
int[] np = new int[n+1];
np[0]=1;
np[1]=1;
for(int i=2;i
-
7/25/2019 Algoritmi si structuri de date.pdf
33/402
1.1. ALGORITMI ELEMENTARI 23
while(i!=0) // pentru calculul dimensiunii vectorului b
{
c=d/i; r=d%i; n++; d=i; i=r;
}
int[] b=new int[n];
int poz=0;
d=p; i=q;
while(i!=0) // pentru calculul coeficientilor vectorului b
{
c=d/i; r=d%i; b[poz]=c; poz++; d=i; i=r;
}
return b;
}
}
1.1.26 Fractie continua: determinarea fractiei initiale
class FractieContinua2
{
public static void main(String[] args)
{
int p,q;
int[] b={2,1,2,1,3};
p=calcA(b); q=calcB(b);
System.out.println(p+"/"+q);}//main
static int calcA(int[] b)
{
int n=b.length-1;
int[] A=new int[b.length];
A[0]=b[0];
A[1]=b[0]*b[1]+1;
for(int k=2;k
-
7/25/2019 Algoritmi si structuri de date.pdf
34/402
24 CAPITOLUL 1. EXERCITII SIMPLE
B[0]=1;
B[1]=b[1];
for(int k=2;kb_i X - a_i
{
int n=a.length;
int[] p={-a[0],b[0]},// p=b[0] X -a[0]q={13,13}; // q=initializat "aiurea" pentru dimensiune !
// afisv(p);
for(int k=1;k
-
7/25/2019 Algoritmi si structuri de date.pdf
35/402
1.1. ALGORITMI ELEMENTARI 25
int i,j,k;
for(k=0;k
-
7/25/2019 Algoritmi si structuri de date.pdf
36/402
26 CAPITOLUL 1. EXERCITII SIMPLE
{
int n=a.length-1,k,s=0;
for(k=0;k
-
7/25/2019 Algoritmi si structuri de date.pdf
37/402
1.1. ALGORITMI ELEMENTARI 27
p=p*(nrd+1);
d=3;
while(d*d1) p*=2;
return p;
}
}
1.1.30 Functia lui Euler
class EulerFunctia
{
public static void main(String [] args)
{
int n=12;
System.out.println(n+" --> "+fi(n));
}
static int fi(int n)
{
int card=0;
for(int k=1;kb) { d=a; i=b; } else { d=b; i=a; }while(i!=0) { c=d/i;r=d%i; d=i; i=r; }
return d;
}
}
-
7/25/2019 Algoritmi si structuri de date.pdf
38/402
28 CAPITOLUL 1. EXERCITII SIMPLE
1.1.31 Formula de calcul pentru functia lui Euler
class EulerCalcul
{
public static void main(String[] args)
{
int n=12;
System.out.println(n+" --> "+calculEuler(n));
}
static int calculEuler(int nr)
{
int d;
int nrd;int p=1,nrr=nr;
d=2;
nrd=0;
while(nr%d==0)
{
nrd++;
nr=nr/d;
}
if(nrd>0) { p=p*(d-1); nrr=nrr/d; }
d=3;while(d*d0) { p=p*(d-1); nrr=nrr/d; }
d=d+2;
}
if(nr>1) { p=p*(nr-1); nrr=nrr/nr; }
return p*nrr;
}
}
1.1.32 Ghiceste numarul
Se alege un numar natural ntre 1 si n. Calculatorul ntreaba cum este fatade mijlocul extremelor curente (de la fiecare pas). Numarul se ghiceste n maxim1 + [log2(n)] pasi (ntrebari).
-
7/25/2019 Algoritmi si structuri de date.pdf
39/402
1.1. ALGORITMI ELEMENTARI 29
import java.io.*;
class GhicesteNr
{
static int nrIncercare=0;
public static void main(String[] args) throws IOException
{
int n=-1; // alege un numar intre 1 ... n
while (n
-
7/25/2019 Algoritmi si structuri de date.pdf
40/402
30 CAPITOLUL 1. EXERCITII SIMPLE
{
scrieText("Cum este fata de "+m+" ?");
scrieText("1 = mai mic; 2 = mai mare; 3 = EGAL raspuns: ");
raspuns = getInt();
}
return raspuns;
} // propun()
static void scrieText(String s)
{
System.out.print("\n"+s);
System.out.flush();
}
public static String getString() throws IOException{
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String s = br.readLine(); return s;
} // getString()
public static int getInt() throws IOException
{
String s = getString();
return Integer.parseInt(s);
}
}
1.1.33 Calculul functiei arcsin
Dezvoltarea n serie a functiei este urmatoarea:
arcsin(x) = x +1
2
x3
3 +
1
2
3
4
x5
5 + ... +
1
2
3
4...
2n 32n 2
x2n1
2n 1+ ...= t1+ t2+ t3+ ... + tn+ ...
Se poate observa ca:
t1= x si tk+1= x
x
(2k
1)
(2k
1)
2k(2k+ 1) tk pentru k1
Vom calcula o suma finita (adaugam termeni pana cand modulul diferenteia doi termeni consecutivi este inferior unei valori date si fara a depasi numarulnMax de termeni din serie).
-
7/25/2019 Algoritmi si structuri de date.pdf
41/402
1.1. ALGORITMI ELEMENTARI 31
class ArcSinus
{
static double dif;
static int k;
public static void main(String[] args)
{
double x=Math.sin(Math.toRadians(-60)),eps=1.0e-15;
int nMax=100000;
System.out.println("arcsin("+x+") = "+
Math.toDegrees(arcSinus(x,eps,nMax))+"\t"+dif+"\t"+k);
}
static double arcSinus(double x, double eps, int nMax)
{double tk=x,s=tk,tk1=0;
dif=0;
k=1;
do
{
tk1=tk*x*x*(2*k-1)*(2*k-1)/(4*k*k+2*k);
s+=tk1;
dif=Math.abs(tk1-tk);
tk=tk1;
k++;
} while((dif>eps)&&(kb>0
{ // inlocuiesc resturile de la sfarsit spre inceput !!!
static final int NMAX=20;
static int[] r = new int[NMAX],
c = new int[NMAX],
alfa = new int[NMAX],beta = new int[NMAX];
public static void main(String[] args)
{
-
7/25/2019 Algoritmi si structuri de date.pdf
42/402
32 CAPITOLUL 1. EXERCITII SIMPLE
int a=221,b=29;
//int a=614, b=513;
if(a>b) {r[0]=a; r[1]=b;} else {r[0]=b; r[1]=a;}
int k=0;
do
{
k++;
c[k]=r[k-1]/r[k];
r[k+1]=r[k-1]%r[k];
System.out.println(r[k-1]+"="+c[k]+"*"+r[k]+"+"+r[k+1]);
} while (r[k+1]!=0);
int cmmdc=r[k];
System.out.print("cmmdc("+a+","+b+") = "+cmmdc);
int n=k-1;
alfa[n]=1;beta[n]=-c[n];
for(int i=n-1;i>=1;i--)
{
alfa[i]=beta[i+1];
beta[i]=alfa[i+1]-c[i]*beta[i+1];
}
System.out.println(" = ("+alfa[1]+")*"+r[0]+" + ("+beta[1]+")*"+r[1]);
}
}
/* OBS:
initializari: r[0]=max(a,b); r[1]=min(a,b);algoritm: r[0] = r[1]c[1]+r[2]
r[1] = r[2]c[2]+r[3]
r[2] = r[3]c[3]+r[4]
...
r[n-2] = r[n-1]c[n-1]+r[n] cmmdc(a,b)=r[n]
r[n-1] = r[n]c[n]+0 (gata!!!) ===============
*/
1.2 Calculul unor sume si produse
1.2.1 Calculul functiei arcsin
-
7/25/2019 Algoritmi si structuri de date.pdf
43/402
1.2. CALCULUL UNOR SUME SI PRODUSE 33
1.2.2 Calcul f(n) =
n
k=012kCnn+k
class SP01
{
public static void main(String[]args)
{
int n=10;
int k, s, p;
s=0;
for(k=0;k
-
7/25/2019 Algoritmi si structuri de date.pdf
44/402
34 CAPITOLUL 1. EXERCITII SIMPLE
}
p=1;
for(i=1;ib) {d=a;i=b;} else {d=b;i=a;}
while (i!=0) { c=d/i; r=d%i; d=i; i=r; }
return d;
}
}
1.2.3 Calcul f(n) =
n1k=0C
k
n1nn1k(k+ 1)!
class SP02
{
public static void main(String[]args)
{
int n=4;
int s, p, k;
s=0;
for(k=0;kn/2) k=n-k;
int i,j,d;
int[] x=new int[k+1];int[] y=new int[k+1];
for(i=1;i
-
7/25/2019 Algoritmi si structuri de date.pdf
45/402
1.2. CALCULUL UNOR SUME SI PRODUSE 35
for(i=1;i
-
7/25/2019 Algoritmi si structuri de date.pdf
46/402
36 CAPITOLUL 1. EXERCITII SIMPLE
{
public static void main(String[]args)
{
int n=5;
int s, p, k;
s=0;
for(k=1;kn/2) k=n-k;
int i,j,d;
int[] x=new int[k+1];
int[] y=new int[k+1];
for(i=1;i
-
7/25/2019 Algoritmi si structuri de date.pdf
47/402
1.2. CALCULUL UNOR SUME SI PRODUSE 37
static int putere(int a,int n)
{
int k;
int p;
p=1;
for(k=1;k=3;k--)
{
xn=-k*xv;
s+=xn;xv=xn;
}
System.out.println("f("+n+") = "+s);
System.out.println("MaxLong= "+Long.MAX_VALUE);
}
}
1.2.6 Calcul s(n,m) =
m1k=0 C
k
m(1)k(m k)n
s(n, m) reprezinta numarul functiilor surjective f :{1, 2,...,n} {1, 2,...,m}.
class SP05{
public static void main (String[]args)
{
int n;
-
7/25/2019 Algoritmi si structuri de date.pdf
48/402
38 CAPITOLUL 1. EXERCITII SIMPLE
int m=5;
int k, s;
for(n=1;n
-
7/25/2019 Algoritmi si structuri de date.pdf
49/402
1.2. CALCULUL UNOR SUME SI PRODUSE 39
if(a>b) {d=a;i=b;} else{d=b;i=a;}
while(i!=0){ c=d/i; r=d%i; d=i; i=r; }
return d;
}
}
1.2.7 Calcul f(m,n,1,...,n) = (C1m
)1 ...
Cnm+n1
n
class SP06
{
public static void main(String[] args)
{
int m=2;int n=3;
int k;
int[] lam=new int[n+1];
int rez;
lam[1]=1;
lam[2]=3;
lam[3]=2;
rez=1;
for(k=0;k
-
7/25/2019 Algoritmi si structuri de date.pdf
50/402
40 CAPITOLUL 1. EXERCITII SIMPLE
for(j=1;j
-
7/25/2019 Algoritmi si structuri de date.pdf
51/402
1.2. CALCULUL UNOR SUME SI PRODUSE 41
for(i=1;i
-
7/25/2019 Algoritmi si structuri de date.pdf
52/402
42 CAPITOLUL 1. EXERCITII SIMPLE
1.2.9 Calcul f(n) = 12n
n
k=0(1)kCkn2k(2n k)!
class SP08
{
public static void main(String[] args)
{
int n=4;
int s,k;
s=0;
for(k=0;k
-
7/25/2019 Algoritmi si structuri de date.pdf
53/402
1.2. CALCULUL UNOR SUME SI PRODUSE 43
x[i]=x[i]/d;
if(y[j]==1) break;
}
rez=1;
for(i=1;ib) {d=a;i=b;} else {d=b;i=a;}
while(i!=0) { c=d/i; r=d%i; d=i; i=r; }
return d;
}}
1.2.10 Numerele Stirling de speta a II-a
Fie S(n, m) numarul modalitatilor de partitionare a unei multimi cu n ele-mente n m submultimi nevide (de exemplu, plasare numerelor{1, 2,...,n} n mcutii identice si nenumerotate astfel ncat nici o cutie sa nu fie goala!). Acest numarndeplineste urmatoarea relatie de recurenta:
S(n + 1, m) = S(n, m) + mS(n, m) unde S(n, n) = S(n, 1) = 1.
Scrieti un program care sa calculeze, de exemplu, S(11, 2).
class SP09
{
public static void main(String[] args)
{
int n=11,m=2; // n >= m
int i, j, jmin;
long t1,t2;
int[][] a=new int[n+1][m+1];
t1=System.currentTimeMillis();
for(i=1;i
-
7/25/2019 Algoritmi si structuri de date.pdf
54/402
44 CAPITOLUL 1. EXERCITII SIMPLE
}
System.out.println(a[n][m]);
t2=System.currentTimeMillis();
System.out.println("Timp = "+(t2-t1));
}
static int min(int a, int b)
{
if(a
-
7/25/2019 Algoritmi si structuri de date.pdf
55/402
1.2. CALCULUL UNOR SUME SI PRODUSE 45
static int comb(int n,int k)
{
int i,j,d;
int rez;
int[] x=new int[k+1];
int[] y=new int[k+1];
for(i=1;i
-
7/25/2019 Algoritmi si structuri de date.pdf
56/402
46 CAPITOLUL 1. EXERCITII SIMPLE
public static void main(String[] args)
{
int n=12,m=3;
int[][] p=new int[n+1][n+1];
int nsol;
int i,j,k;
p[1][1]=1;
for(i=2;i
-
7/25/2019 Algoritmi si structuri de date.pdf
57/402
1.2. CALCULUL UNOR SUME SI PRODUSE 47
class SP12
{
public static void main(String[] args)
{
int n=17,i,k;
int p;
int s;
int[] c=new int[n+1];
c[0]=1;
for(i=1;i
-
7/25/2019 Algoritmi si structuri de date.pdf
58/402
48 CAPITOLUL 1. EXERCITII SIMPLE
s=s+p;
}
e[i]=s;
System.out.println(i+" : "+e[i]);
}
}
}
1.2.15 Numerele Stirling de speta a II-a
Fie S(n, m) numarul modalitatilor de partitionare a unei multimi cu n ele-mente n m submultimi nevide (de exemplu, plasare numerelor{1, 2,...,n} n mcutii identice si nenumerotate astfel ncat nici o cutie sa nu fie goala!). Acest numar
se poate calcula cu formula:
S(n, m) = 1
m!
m1k=0
(1)kCkm(m k)n.
Scrieti un program care sa calculeze, de exemplu, S(11, 2).
class SP14
{
public static void main(String[]args)
{
int n=11,m=2;
int s, p, k;s=0;
for(k=0;kn/2) k=n-k;
int i,j,d;
int[] x=new int[k+1];
int[] y=new int[k+1];
-
7/25/2019 Algoritmi si structuri de date.pdf
59/402
1.2. CALCULUL UNOR SUME SI PRODUSE 49
for(i=1;i
-
7/25/2019 Algoritmi si structuri de date.pdf
60/402
50 CAPITOLUL 1. EXERCITII SIMPLE
1.2.16 Calculf(n) =
n
k=0Ck
nFk
class SP15
{
static int n=15;
static int[] f=new int[n+1];
public static void main(String[] args)
{
int k,i;
f[0]=0;
f[1]=1;
for(k=2;k
-
7/25/2019 Algoritmi si structuri de date.pdf
61/402
1.2. CALCULUL UNOR SUME SI PRODUSE 51
if(y[j]==1) break;
}
rez=1;
for(i=1;ib) {d=a;i=b;} else {d=b;i=a;}
while(i!=0) { c=d/i; r=d%i; d=i; i=r;}
return d;
}
}
1.2.17 Calculf(n) =
n
k=0Ck
n2kFk
class SP16
{
static int n=15;
static int[] f=new int[n+1];
public static void main(String[] args)
{ int k,i;
f[0]=0;
f[1]=1;
for(k=2;k
-
7/25/2019 Algoritmi si structuri de date.pdf
62/402
52 CAPITOLUL 1. EXERCITII SIMPLE
}
static int comb(int n,int k)
{
if(k>n/2) k=n-k;
int i,j,d;
int rez;
int[] x=new int[k+1];
int[] y=new int[k+1];
for(i=1;i
-
7/25/2019 Algoritmi si structuri de date.pdf
63/402
Capitolul 2
Simularea operatiilor cu
numere mari
2.1 Operatii cu numere mari
2.1.1 Vectorul cifrelor unui numar
class NrV
{ public static void main(String[] args)
{
int nr=232425;
int[] x=nrv(nr);
afisv(x);
}
static void afisv(int[] x)
{
int nx=x.length;
int i;
for(i=nx-1;i>=0;i--) System.out.print(x[i]);
System.out.println();}
static int[] nrv(int nr)
{
53
-
7/25/2019 Algoritmi si structuri de date.pdf
64/402
54 CAPITOLUL 2. SIMULAREA OPERATIILOR CU NUMERE MARI
int nc;
int nrrez=nr;
nc=0;
while(nr!=0) {nc++; nr=nr/10;}
int[] x=new int[nc];
nr=nrrez;
nc=0;
while(nr!=0)
{
x[nc]=nr%10;
nc++;
nr=nr/10;
}
return x;
}}
2.1.2 Adunarea numerelor mari
class SumaNrMari
{
public static void main(String[] args)
{
int[] x=nrv(123); afisv(x);
int[] y=nrv(456); afisv(y);int[] z=suma(x,y);
afisv(z);
}
static void afisv(int[] x)
{
int nx=x.length;
int i;
for(i=nx-1;i>=0;i--) System.out.print(x[i]);
System.out.println();
}
static int[] nrv(int nr){
int nc;
int nrrez=nr;
nc=0;
-
7/25/2019 Algoritmi si structuri de date.pdf
65/402
2.1. OPERATII CU NUMERE MARI 55
while(nr!=0) { nc++; nr=nr/10; }
int[] x=new int[nc];
nr=nrrez;
nc=0;
while(nr!=0)
{
x[nc]=nr%10;
nc++;
nr=nr/10;
}
return x;
}
static int[] suma(int[] x,int[] y)
{int k,s,t;
int nx=x.length;
int ny=y.length;
int nz;
if(nx>ny) nz=nx+1; else nz=ny+1;
int[] z=new int[nz];
t=0;
for(k=0;k
-
7/25/2019 Algoritmi si structuri de date.pdf
66/402
56 CAPITOLUL 2. SIMULAREA OPERATIILOR CU NUMERE MARI
class ProdusNrMari
{
public static void main(String[] args)
{
int[] x=nrv(12); afisv(x);
int[] y=nrv(9); afisv(y);
int[] z=produs(x,y);
afisv(z);
}
static void afisv(int[] x)
{
int nx=x.length;
int i;
for(i=nx-1;i>=0;i--) System.out.print(x[i]);System.out.println();
}
static int[] nrv(int nr)
{
int nc;
int nrrez=nr;
nc=0;
while(nr!=0) {nc++; nr=nr/10;}
int[] x=new int[nc];
nr=nrrez;
nc=0;while(nr!=0)
{
x[nc]=nr%10;
nc++;
nr=nr/10;
}
return x;
}
static int[] produs(int[] x,int[] y)
{
int i,j,t,s;
int nx=x.length;int ny=y.length;
int nz=nx+ny;
int[][] a=new int[ny][nx+ny];
int[] z=new int[nx+ny];
-
7/25/2019 Algoritmi si structuri de date.pdf
67/402
2.1. OPERATII CU NUMERE MARI 57
for(j=0;j
-
7/25/2019 Algoritmi si structuri de date.pdf
68/402
58 CAPITOLUL 2. SIMULAREA OPERATIILOR CU NUMERE MARI
{
int nx=x.length;
int i;
for(i=nx-1;i>=0;i--) System.out.print(x[i]);
System.out.println();
}
static int[] nrv(int nr)
{
int nc;
int nrrez=nr;
nc=0;
while(nr!=0) {nc++; nr=nr/10;}
int[] x=new int[nc];
nr=nrrez;nc=0;
while(nr!=0)
{
x[nc]=nr%10;
nc++;
nr=nr/10;
}
return x;
}
static int[] impartLa2(int[] a)
{ int na,nb,k,t=0;
na=a.length-1;
if(a[na]==1) nb=na-1; else nb=na;
int[] b=new int[nb+1];
if(na==nb)
for(k=na;k>=0;k--)
{
a[k]+=10*t;
b[k]=a[k]/2;
t=a[k]%2;
}
else
{t=a[na];
for(k=na-1;k>=0;k--)
{
a[k]+=10*t;
-
7/25/2019 Algoritmi si structuri de date.pdf
69/402
2.1. OPERATII CU NUMERE MARI 59
b[k]=a[k]/2;
t=a[k]%2;
}
}
return b;
}
}
2.1.5 Functia putere cu numere mari
import java.io.*;
class PutereNRMari
{public static void main (String[]args) throws IOException
{
int a,n;
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in));
System.out.print("a = "); a=Integer.parseInt(br.readLine());
System.out.print("n = "); n=Integer.parseInt(br.readLine());
System.out.print("putere("+a+","+n+") = "); afisv(putere(a,n));
}
static int[] nrv(int nr)
{ int nc;
int nrrez=nr;
nc=0;
while(nr!=0) {nc++; nr=nr/10;}
int[] x=new int[nc];
nr=nrrez;
nc=0;
while(nr!=0)
{
x[nc]=nr%10;
nc++;
nr=nr/10;
}return x;
}
static int[] putere(int a,int n)
-
7/25/2019 Algoritmi si structuri de date.pdf
70/402
60 CAPITOLUL 2. SIMULAREA OPERATIILOR CU NUMERE MARI
{
int k;
int[] p;
p=nrv(1);
for(k=1;k=0;i--) System.out.print(x[i]);
System.out.println();
}
static int[] produs(int[] x,int[] y)
{
int i,j,t,s;
int nx=x.length;
int ny=y.length;
int nz=nx+ny;
int [][] a=new int[ny][nx+ny];
int[] z=new int[nx+ny];
for(j=0;j
-
7/25/2019 Algoritmi si structuri de date.pdf
71/402
2.1. OPERATII CU NUMERE MARI 61
}
if(z[nz-1]!=0)return z;
else
{
int[] zz=new int[nz-1];
for(j=0;j
-
7/25/2019 Algoritmi si structuri de date.pdf
72/402
62 CAPITOLUL 2. SIMULAREA OPERATIILOR CU NUMERE MARI
}
static int[] int[] factorial(int n)
{
int k;
int[] p;
p=nrv(1);
for(k=1;k=0;i--) System.out.print(x[i]);
System.out.println();
}
static int[] produs(int[] x,int[] y)
{
int i,j,t,s;
int nx=x.length;
int ny=y.length;
int nz=nx+ny;
int [][] a=new int[ny][nx+ny];
int[] z=new int[nx+ny];for(j=0;j
-
7/25/2019 Algoritmi si structuri de date.pdf
73/402
2.1. OPERATII CU NUMERE MARI 63
s=s+t;
z[j]=s%10;
t=s/10;
}
if(z[nz-1]!=0)return z;
else
{
int[] zz=new int[nz-1];
for(j=0;jn/2) k=n-k; // o mica optimizare !
int[] x=new int[k+1];
int[] y=new int[k+1];
for(i=1;i
-
7/25/2019 Algoritmi si structuri de date.pdf
74/402
64 CAPITOLUL 2. SIMULAREA OPERATIILOR CU NUMERE MARI
x[i]=x[i]/d;
y[j]=y[j]/d;
if(y[j]==1) break;
}
int[] p=nrv(1);
for(i=1;ib) {d=a; i=b;} else {d=b; i=a;}
while (i != 0)
{c=d/i; // nu se foloseste !
r=d%i;
d=i;
i=r;
}
return d;
}
static int[] nrv(int nr)
{
int nc;
int nrrez=nr;nc=0;
while(nr!=0) {nc++; nr=nr/10;}
int[] x=new int[nc];
nr=nrrez;
nc=0;
while(nr!=0)
{
x[nc]=nr%10;
nc++;
nr=nr/10;
}
return x;
}
static void afisv(int[] x)
{
int nx=x.length;
-
7/25/2019 Algoritmi si structuri de date.pdf
75/402
2.1. OPERATII CU NUMERE MARI 65
int i;
for(i=nx-1;i>=0;i--) System.out.print(x[i]);
System.out.println();
}
static int[] produs(int[] x,int[] y)
{
int i,j,t,s;
int nx=x.length;
int ny=y.length;
int nz=nx+ny;
int [][] a=new int[ny][nx+ny];
int[] z=new int[nx+ny];
for(j=0;j
-
7/25/2019 Algoritmi si structuri de date.pdf
76/402
66 CAPITOLUL 2. SIMULAREA OPERATIILOR CU NUMERE MARI
2.2 Sume si produse cu numere mari
2.2.1 Numarul lui Catalan Cn= 1n+1
Cn2n cu numere mari
import java.io.*;
class CatalanNrMari
{
public static void main (String[]args) throws IOException
{
int n,k;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("n = "); n=Integer.parseInt(br.readLine());
System.out.print("catalan("+n+") = "); afisv(catalan(n));
}
static int[] catalan(int n)
{
int i,j,d;
int[] x=new int[n+1];
int[] y=new int[n+1];
for(i=2;i
-
7/25/2019 Algoritmi si structuri de date.pdf
77/402
2.2. SUME SI PRODUSE CU NUMERE MARI 67
while (i != 0)
{
c=d/i; // nu se foloseste !
r=d%i;
d=i;
i=r;
}
return d;
}
static int[] nrv(int nr)
{
int nc;
int nrrez=nr;
nc=0;while(nr!=0) {nc++; nr=nr/10;}
int[] x=new int[nc];
nr=nrrez;
nc=0;
while(nr!=0)
{
x[nc]=nr%10;
nc++;
nr=nr/10;
}
return x;
}
static void afisv(int[] x)
{
int nx=x.length;
int i;
for(i=nx-1;i>=0;i--) System.out.print(x[i]);
System.out.println();
}
static int[] produs(int[] x,int[] y)
{
int i,j,t,s;
int nx=x.length;int ny=y.length;
int nz=nx+ny;
int[][] a=new int[ny][nx+ny];
int[] z=new int[nx+ny];
-
7/25/2019 Algoritmi si structuri de date.pdf
78/402
-
7/25/2019 Algoritmi si structuri de date.pdf
79/402
2.2. SUME SI PRODUSE CU NUMERE MARI 69
{
s=nrv(0);
for(k=0;k=0;k--)
{
a[k]+=10*t;
b[k]=a[k]/2;
t=a[k]%2;
}
}
return b;
}
static int[] suma(int[] x, int[] y){
int i,j,t;
int ncx=x.length;
int ncy=y.length;
-
7/25/2019 Algoritmi si structuri de date.pdf
80/402
70 CAPITOLUL 2. SIMULAREA OPERATIILOR CU NUMERE MARI
int ncz;
if(ncx>ncy) ncz=ncx+1; else ncz=ncy+1;
int[] xx=new int[ncz];
int[] yy=new int[ncz];
int[] z=new int[ncz];
for(i=0;i
-
7/25/2019 Algoritmi si structuri de date.pdf
81/402
2.2. SUME SI PRODUSE CU NUMERE MARI 71
{
z[j]=0;
for(i=0;i
-
7/25/2019 Algoritmi si structuri de date.pdf
82/402
72 CAPITOLUL 2. SIMULAREA OPERATIILOR CU NUMERE MARI
static int[] comb (int n, int k)
{
int[] rez;
int i,j;
int d;
int[] x=new int[k+1];
int[] y=new int[k+1];
for(i=1;i
-
7/25/2019 Algoritmi si structuri de date.pdf
83/402
2.2. SUME SI PRODUSE CU NUMERE MARI 73
int k;
s=nrv(0);
for(k=0;k
-
7/25/2019 Algoritmi si structuri de date.pdf
84/402
74 CAPITOLUL 2. SIMULAREA OPERATIILOR CU NUMERE MARI
{
z[j]=t;
for(i=0;i
-
7/25/2019 Algoritmi si structuri de date.pdf
85/402
2.2. SUME SI PRODUSE CU NUMERE MARI 75
int d,i,c,r;
if(a>b) {d=a;i=b;}else {d=b;i=a;}
while(i!=0){c=d/i;r=d%i;d=i;i=r;}
return d;
}
static int[] putere(int a,int n)
{
int k;int[]p;
p=nrv(1);
for(k=1;k
-
7/25/2019 Algoritmi si structuri de date.pdf
86/402
76 CAPITOLUL 2. SIMULAREA OPERATIILOR CU NUMERE MARI
int[] zz=new int [nz-1];
for(i=0;i
-
7/25/2019 Algoritmi si structuri de date.pdf
87/402
2.2. SUME SI PRODUSE CU NUMERE MARI 77
int[] yy=new int[ncz];
int[] z=new int[ncz];
for(i=0;i
-
7/25/2019 Algoritmi si structuri de date.pdf
88/402
78 CAPITOLUL 2. SIMULAREA OPERATIILOR CU NUMERE MARI
z[j]=z[j]+t;
t=z[j]/10;
z[j]=z[j]%10;
}
if(z[m+n-1]!= 0) return z;
else
{
int[] zz=new int[m+n-1];
for(i=0;i=0;i--) System.out.print(x[i]);
System.out.print(" ---> "+x.length+" cifre");
System.out.println();
}
static int[] nrv(int nr)
{
int nrrez=nr;
int nc=0;
while(nr!=0) { nc++; nr=nr/10; }int[]x=new int [nc];
nr=nrrez;
nc=0;
while(nr!=0) { x[nc]=nr%10; nc++; nr=nr/10; }
return x;
}
static int[] putere (int a, int n)
{
int[] rez;
int k;
rez=nrv(1);
for(k=1;k
-
7/25/2019 Algoritmi si structuri de date.pdf
89/402
2.2. SUME SI PRODUSE CU NUMERE MARI 79
{
int[] rez;
int i,j;
int d;
int[] x=new int[k+1];
int[] y=new int[k+1];
for(i=1;i
-
7/25/2019 Algoritmi si structuri de date.pdf
90/402
80 CAPITOLUL 2. SIMULAREA OPERATIILOR CU NUMERE MARI
lam[1]=5;
lam[2]=6;
lam[3]=7;
lam[4]=8;
lam[5]=9;
rez=nr2v(1);
for(k=0;k
-
7/25/2019 Algoritmi si structuri de date.pdf
91/402
2.2. SUME SI PRODUSE CU NUMERE MARI 81
while (i!=0) { c=d/i; r=d%i; d=i; i=r; }
return d;
}
static int[] nr2v(int nr)
{
int nrr=nr,nc=0,i;
while(nr!=0) { nc++; nr=nr/10; }
int[] nrv=new int[nc];
nr=nrr;
for(i=0;i
-
7/25/2019 Algoritmi si structuri de date.pdf
92/402
82 CAPITOLUL 2. SIMULAREA OPERATIILOR CU NUMERE MARI
return zz;
}
}
static void afisv(int[] x)
{
int i;
for(i=x.length-1;i>=0;i--) System.out.print(x[i]);
System.out.println();
}
}
2.2.6 Numerele Stirling de speta a II-a cu numere mari
Fie S(n, m) numarul modalitatilor de partitionare a unei multimi cu n ele-mente n m submultimi nevide (de exemplu, plasare numerelor{1, 2,...,n} n mcutii identice si nenumerotate astfel ncat nici o cutie sa nu fie goala!). Acest numarndeplineste urmatoarea relatie de recurenta:
S(n + 1, m) = S(n, m) + mS(n, m) unde S(n, n) = S(n, 1) = 1.
Scrieti un program care sa calculeze, de exemplu, S(123, 45).
class SP09NrMari
{
public static void main(String[] args)
{ int n=123,m=45;
int i,j;
long t1,t2;
int[][][] a=new int[n+1][n+1][1];
t1=System.currentTimeMillis();
for(i=1;i
-
7/25/2019 Algoritmi si structuri de date.pdf
93/402
2.2. SUME SI PRODUSE CU NUMERE MARI 83
static int[] suma(int[]x,int[]y)
{
int nx=x.length, ny=y.length, i,min,max,t;
if(nx>ny) { min=ny; max=nx; } else { min=nx; max=ny; }
int[] z=new int[max+1];
t=0;
for(i=0;i
-
7/25/2019 Algoritmi si structuri de date.pdf
94/402
84 CAPITOLUL 2. SIMULAREA OPERATIILOR CU NUMERE MARI
{
int nx=x.length, ny=y.length, i,j,t,s;
int[] z=new int[nx+ny];
int[][] a=new int[ny][nx+ny];
for(j=0;j
-
7/25/2019 Algoritmi si structuri de date.pdf
95/402
2.2. SUME SI PRODUSE CU NUMERE MARI 85
class SP10NrMari
{
public static void main(String[] args)
{
int n=71;
int k,i;
int[][] b=new int[n+1][1];
int[] prod={1};
b[0]=nr2v(1);
for(i=1;i
-
7/25/2019 Algoritmi si structuri de date.pdf
96/402
86 CAPITOLUL 2. SIMULAREA OPERATIILOR CU NUMERE MARI
int[] zz=new int[nz-1];
for(i=0;i
-
7/25/2019 Algoritmi si structuri de date.pdf
97/402
2.2. SUME SI PRODUSE CU NUMERE MARI 87
for(i=0;i=0;i--) System.out.print(x[i]);
System.out.println();
}
static int[] comb(int n,int k)
{
int i,j,d;int[] rez;
int[] x=new int[k+1];
int[] y=new int[k+1];
for(i=1;i
-
7/25/2019 Algoritmi si structuri de date.pdf
98/402
88 CAPITOLUL 2. SIMULAREA OPERATIILOR CU NUMERE MARI
2.2.8 Partitiile unui numar natural cu numere mari
FieP(n, m) numarul modalitatilor de partitionare a numarului naturaln casuma de m numere naturale fara a se tine cont de ordinea acestora n suma (nscrierean = a1+ a2+ ... + am presupunem a1a2...am1). Acest numarndeplineste urmatoarea relatie de recurenta:
P(n + k, k) = P(n, 1) + P(n, 2) + ... + P(n, k) unde P(n, n) =P(n, 1) = 1.
Scrieti un program care sa calculeze, de exemplu, P(123, 45).
class SP11NrMari
{
public static void main(String[] args)
{int n=123,m=45;
int[][][] p=new int[n+1][n+1][1];
int[] nsol;
int i,j,k;
p[1][1]=nr2v(1);
for(i=2;i
-
7/25/2019 Algoritmi si structuri de date.pdf
99/402
2.2. SUME SI PRODUSE CU NUMERE MARI 89
int[] xx=new int[nz];
int[] yy=new int[nz];
for(i=0;i
-
7/25/2019 Algoritmi si structuri de date.pdf
100/402
90 CAPITOLUL 2. SIMULAREA OPERATIILOR CU NUMERE MARI
a[j][j+nx]=t;
}
t=0;
for(j=0;j
-
7/25/2019 Algoritmi si structuri de date.pdf
101/402
2.2. SUME SI PRODUSE CU NUMERE MARI 91
for(i=1;i
-
7/25/2019 Algoritmi si structuri de date.pdf
102/402
92 CAPITOLUL 2. SIMULAREA OPERATIILOR CU NUMERE MARI
}
static void afisv(int[] x)
{
int nx=x.length;
int i;
for(i=nx-1;i>=0;i--) System.out.print(x[i]);
System.out.println(" --> "+x.length+" cifre");
}
static int[] nr2v(int nr)
{
int nc;
int nrrez=nr;
nc=0;while(nr!=0) {nc++; nr=nr/10;}
int[] x=new int[nc];
nr=nrrez;
nc=0;
while(nr!=0) { x[nc]=nr%10; nc++; nr=nr/10; }
return x;
}
static int[] inmnr(int[] x, int[] y)
{
int nx=x.length;
int ny=y.length;int i,j,t,s;
int[] z=new int[nx+ny];
int[][] a=new int [ny][nx+ny];
for(j=0;j
-
7/25/2019 Algoritmi si structuri de date.pdf
103/402
2.2. SUME SI PRODUSE CU NUMERE MARI 93
s=0;
for(i=0;i
-
7/25/2019 Algoritmi si structuri de date.pdf
104/402
94 CAPITOLUL 2. SIMULAREA OPERATIILOR CU NUMERE MARI
static int[] suma(int[] x, int[] y)
{
int nx=x.length;
int ny=y.length;
int min,max,t,k;
if(nx>ny){max=nx;min=ny;}else{max=ny;min=nx;}
int[] z=new int[max+1];
t=0;
for(k=0;k
-
7/25/2019 Algoritmi si structuri de date.pdf
105/402
2.2. SUME SI PRODUSE CU NUMERE MARI 95
System.out.println(" --> "+x.length);
}
static int[] nr2v(int nr) // ok
{
int nc;
int nrrez=nr;
nc=0;
while(nr!=0) {nc++; nr=nr/10;}
int[] x=new int[nc];
nr=nrrez;
nc=0;
while(nr!=0)
{
x[nc]=nr%10;nc++;
nr=nr/10;
}
return x;
}
static int[] inmnr(int[] x, int[] y)
{
int nx=x.length;
int ny=y.length;
int i,j,t,s;
int[] z=new int[nx+ny];int[][] a=new int [ny][nx+ny];
for(j=0;j
-
7/25/2019 Algoritmi si structuri de date.pdf
106/402
96 CAPITOLUL 2. SIMULAREA OPERATIILOR CU NUMERE MARI
s=s+t;
z[j]=s%10;
t=s/10;
}
if(z[nx+ny-1]!=0) return z;
else
{
int[] zz=new int[nx+ny-1];
for(i=0;i
-
7/25/2019 Algoritmi si structuri de date.pdf
107/402
2.2. SUME SI PRODUSE CU NUMERE MARI 97
static int[] suma(int[] x,int[] y)
{
int nx=x.length;
int ny=y.length;
int nz;
if(nx>ny) nz=nx+1; else nz=ny+1;
int t,i;
int[] z=new int[nz];
int[] xx=new int[nz];
int[] yy=new int[nz];
for(i=0;i
-
7/25/2019 Algoritmi si structuri de date.pdf
108/402
98 CAPITOLUL 2. SIMULAREA OPERATIILOR CU NUMERE MARI
{
t=0;
for(i=0;i
-
7/25/2019 Algoritmi si structuri de date.pdf
109/402
2.2. SUME SI PRODUSE CU NUMERE MARI 99
for(j=2;j
-
7/25/2019 Algoritmi si structuri de date.pdf
110/402
100 CAPITOLUL 2. SIMULAREA OPERATIILOR CU NUMERE MARI
int[][] x=new int[n+1][1];
int[] prod={1};
for(i=1;i
-
7/25/2019 Algoritmi si structuri de date.pdf
111/402
2.2. SUME SI PRODUSE CU NUMERE MARI 101
static int[] nr2v(int nr)
{
int nrr=nr,nc=0,i;
while(nr!=0) { nc++; nr=nr/10; }
int[] nrv=new int[nc];
nr=nrr;
for(i=0;i
-
7/25/2019 Algoritmi si structuri de date.pdf
112/402
102 CAPITOLUL 2. SIMULAREA OPERATIILOR CU NUMERE MARI
static void afisv(int[]x)
{
int i;
for(i=x.length-1;i>=0;i--) System.out.print(x[i]);
System.out.println();
}
static int[] comb(int n,int k)
{
if(k>n/2) k=n-k; // o mica optimizare !
int i,j,d;
int[] rez;
int[] x=new int[k+1];
int[] y=new int[k+1];
for(i=1;i
-
7/25/2019 Algoritmi si structuri de date.pdf
113/402
2.2. SUME SI PRODUSE CU NUMERE MARI 103
}
2.2.13 Fractie continua: determinarea fractiei initiale cu nu-mere mari
class FractieContinua2NrMari
{
public static void main(String[] args)
{
int[] p,q;
int[] b={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25};
p=calcA(b);
q=calcB(b);afisv(p); System.out.println("/"); afisv(q);
}
static int[] calcA(int[] b)
{
int n=b.length-1;
int[][] A=new int[b.length][1];
A[0]=nrv(b[0]);
A[1]=suma(nrv(b[0]*b[1]),nrv(1));
for(int k=2;k
-
7/25/2019 Algoritmi si structuri de date.pdf
114/402
104 CAPITOLUL 2. SIMULAREA OPERATIILOR CU NUMERE MARI
}
static int[] nrv(int nr)
{
int nc;
int nrrez=nr;
nc=0;
while(nr!=0) {nc++; nr=nr/10;}
int[] x=new int[nc];
nr=nrrez;
nc=0;
while(nr!=0) { x[nc]=nr%10; nc++; nr=nr/10; }
return x;
}
static int[] suma(int[] x,int[] y)
{
int k,s,t;
int nx=x.length;
int ny=y.length;
int nz;
if(nx>ny)nz=nx+1; else nz=ny+1;
int[] z=new int[nz];
t=0;
for(k=0;k
-
7/25/2019 Algoritmi si structuri de date.pdf
115/402
2.2. SUME SI PRODUSE CU NUMERE MARI 105
int nx=x.length;
int ny=y.length;
int nz=nx+ny;
int [][] a=new int[ny][nx+ny];
int[] z=new int[nx+ny];
for(j=0;j
-
7/25/2019 Algoritmi si structuri de date.pdf
116/402
106 CAPITOLUL 2. SIMULAREA OPERATIILOR CU NUMERE MARI
public static void main(String[] args) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("n = "); n = Integer.parseInt(br.readLine());
int[][] np = new int[n+1][1];
np[0]=nr2v(1);
np[1]=nr2v(1);
for(int i=2;iny) nz=nx+1; else nz=ny+1;
int t,i;
int[] z=new int[nz];
int[] xx=new int[nz];
int[] yy=new int[nz];
for(i=0;i
-
7/25/2019 Algoritmi si structuri de date.pdf
117/402
2.2. SUME SI PRODUSE CU NUMERE MARI 107
{
int nrr=nr,nc=0,i;
while(nr!=0) { nc++; nr=nr/10; }
int[] nrv=new int[nc];
nr=nrr;
for(i=0;i
-
7/25/2019 Algoritmi si structuri de date.pdf
118/402
108 CAPITOLUL 2. SIMULAREA OPERATIILOR CU NUMERE MARI
for(i=x.length-1;i>=0;i--) System.out.print(x[i]);
System.out.println();
}
}
-
7/25/2019 Algoritmi si structuri de date.pdf
119/402
Capitolul 3
OJI 2002 clasa a IX-a
3.1 Poarta
Se considera harta universului ca fiind o matrice cu 250 de linii si 250 decoloane. In fiecare celula se gaseste o asa numita poarta stelara, iar n anumitecelule se gasesc echipaje ale portii stelare.
La o deplasare, un echipaj se poate deplasa din locul n care se afla n oricarealt loc n care se gaseste o a doua poarta, n cazul nostru n orice alta pozitie dinmatrice.
Nu se permite situarea simultana a mai mult de un echipaj ntr-o celula. Laun moment dat un singur echipaj se poate deplasa de la o poarta stelara la alta.
CerintaDandu-se un numarp (1 < p
-
7/25/2019 Algoritmi si structuri de date.pdf
120/402
110 CAPITOLUL 3. OJI 2002 CLASA A IX-A
pozitiile initiale ale celor p echipaje sunt distincte doua cate doua;
pozitiile finale ale celor p echipaje sunt distincte doua cate doua.
Exemplupoarta.in poarta.out3 41 2 3 46 5 3 93 4 1 2
Timp maxim de executare: 1 secunda/test
3.1.1 Indicatii de rezolvare *
Fie NrStationare numarul echipajelor stationare (care au pozitiile initialesi finale egale) si NrCircuite numarul circuitelor grafului orientat format astfel:nodurile sunt echipa jele si exista arc de la echipajul i la echipajul j daca si numai
daca pozitia finala a echipajului i coincide cu pozitia initiala a echipajului j .Atunci NrMinDeplasari=p+NrCircuite-NrStationare.
3.1.2 Rezolvare detaliata
3.1.3 Codul sursa *
import java.io.*;
class Poarta
{static int p,nmd,nc=0,ns=0;
static int[] xi,yi,xf,yf;
static boolean[] ea; // EsteAnalizat deja
-
7/25/2019 Algoritmi si structuri de date.pdf
121/402
3.1. POARTA 111
public static void main(String[] args) throws IOException
{
StreamTokenizer st=new StreamTokenizer(
new BufferedReader(new FileReader("poarta10.in")));
st.nextToken(); p=(int)st.nval;
xi=new int[p+1];
yi=new int[p+1];
xf=new int[p+1];
yf=new int[p+1];
ea=new boolean[p+1]; // implicit este false
int i;
for(i=1;i
-
7/25/2019 Algoritmi si structuri de date.pdf
122/402
112 CAPITOLUL 3. OJI 2002 CLASA A IX-A
static int succesor(int j) // j --> k
{
int k;
for(k=1;k
-
7/25/2019 Algoritmi si structuri de date.pdf
123/402
3.2. MOUSE 113
mouse.in mouse.out2 4 7 211 2 6 3 1 13 4 1 2 2 1
2 21 21 31 42 4
Explicatie
Timp maxim de executare: 1 secunda/test
3.2.1 Indicatii de rezolvare *
Daca m si n sunt pare atunci numarul de camarute vizitate este mn1iar cantitatea de hrana maxima culeasa este suma cantitatilor de hrana din toatecamarutele cu exceptia celei care are cea mai mica cantitate si se afla pe liniai sicoloana j si i+j este numar impar. Traseul este determinat de o parcurgere peverticala sau orizontala si ocolirea acelei camarute.
Daca m este impar atunci numarul de camarute vizitate este mn iar canti-tatea de hrana maxima culeasa este suma cantitatilor de hrana din toate camarutele.Traseul este determinat de o parcurgere pe orizontala.
Analog pentru situatia n care n este impar.
3.2.2 Rezolvare detaliata
3.2.3 Codul sursa *
import java.io.*;class Mouse
{
static int m,n,imin,jmin,min,s;
static int [][]a;
-
7/25/2019 Algoritmi si structuri de date.pdf
124/402
114 CAPITOLUL 3. OJI 2002 CLASA A IX-A
static PrintWriter out;
public static void main(String[] args) throws IOException
{
int i,j;
StreamTokenizer st=new StreamTokenizer(
new BufferedReader(new FileReader("mouse4.in")));
out=new PrintWriter(new BufferedWriter(new FileWriter("mouse.out")));
st.nextToken();m=(int)st.nval;
st.nextToken();n=(int)st.nval;
a=new int[m+1][n+1];
for(i=1;i
-
7/25/2019 Algoritmi si structuri de date.pdf
125/402
3.2. MOUSE 115
j=1;
out.println(m*n+" "+s);
while(j+1
-
7/25/2019 Algoritmi si structuri de date.pdf
126/402
116 CAPITOLUL 3. OJI 2002 CLASA A IX-A
out.println((i+1)+" " +(j+1));
i=i+2;
while (i
-
7/25/2019 Algoritmi si structuri de date.pdf
127/402
Capitolul 4
OJI 2003 clasa a IX-a
4.1 Text
Vasile lucreaza intens la un editor de texte. Un text este format din unul saumai multe paragrafe. Orice paragraf se termina cu Enter si oricare doua cuvinteconsecutive din acelasi paragraf sunt separate prin spatii (unul sau mai multe). Infunctie de modul de setare a paginii, numarul maxim de caractere care ncap npagina pe o linie este unic determinat (Max).
Functia pe care Vasile trebuie sa o implementeze acum este alinierea n paginaa fiecarui paragraf din text la stanga si la dreapta. Pentru aceasta el va trebui samparta fiecare paragraf n linii separate de lungimeMax (fiecare linie terminata
cu Enter).Impartirea se realizeaza punand numarul maxim posibil de cuvinte pe fiecare
linie, fara mpartirea cuvintelor n silabe.
Pentru aliniere stanga-dreapta, Vasile trebuie sa repartizeze spatii n moduniform ntre cuvintele de pe fiecare linie, astfel ncat ultimul caracter de pelinie sa fie diferit de spatiu, iar numarul total de caractere de pe linie sa fie egalcu Max. Exceptie face numai ultima linie din paragraf, care ramane aliniata lastanga (cuvintele fiind separate printr-un singur spatiu, chiar daca linia nu esteplina).
In general, este putin probabil ca alinierea sa fie realizabila prin plasareaaceluiasi numar de spatii ntre oricare doua cuvinte consecutive de pe linie. Vasileconsidera ca este mai elegant ca, daca ntre unele cuvinte consecutive trebuie plasat
un spatiu n plus fata de alte perechi de cuvinte consecutive, acestea sa fie plasatela nceputul liniei.
CerintaScrieti un program care sa citeasca lungimea unei linii si textul dat si care sa
alinieze textul la stanga si la dreapta.
117
-
7/25/2019 Algoritmi si structuri de date.pdf
128/402
118 CAPITOLUL 4. OJI 2003 CLASA A IX-A
Date de intrare
Fisierul de intrare text.in contine pe prima linie Max, lungimea maxima aunui rand. Pe urmatoarele linii este scris textul.
Date de iesire
Fisierul de iesire text.outcontine textul aliniat stanga-dreapta.
Restrictii si precizuri
2Max1000. Lungimea maxima a oricarui cuvant din text este 25 caractere si nu depaseste
Max.
Lungimea unui paragraf nu depaseste 1000 de caractere. Solutia este unica.Exemple
text.in text.out20 Vasile are multeVasile are multe bomboane bune. bomboane bune.
Explicatie
Pe prima linie au fost plasate cate 3 spatii ntre cuvintele consecutive.
text.in text.out20 Ana are mere.Ana are mere. Ion are multe pereIon are multe pere galbene? galbene?
Explicatie
Intre I on si are exista 2 spatii, ntre are si multe - 2 spatii, iar ntre multesi pere - 1 spatiu.
Observati ca paragraful Ana are mere. (care are lungimea mai mica decat20) a ramas aliniat la stanga, iar ultima linie din fiecare paragraf ramane aliniatala stanga, cuvintele consecutive fiind separate printr-un singur spatiu.
Timp maxim de executare: 1 secunda/test.
4.1.1 Indicatii de rezolvare *
Fiecare paragraf se preia ntr-un vector de string-uri, elementele vectorului
continand cuvintele din paragraf. Se parcurge acest vector, ncepand cu primapozitie, determinand cel mai mare indice i1care permite plasarea cuvintelor de pepozitiile 1,...,i1pe acelasi rand. Se destribuie spatiile disponibile, conform cerinteiproblemei si se afiseaza aceasta linie. Se continua prelucrarea vectorului ncepandcu pozitiai1+ 1, si asa mai departe!
-
7/25/2019 Algoritmi si structuri de date.pdf
129/402
4.1. TEXT 119
4.1.2 Rezolvare detaliata *
21
E cerul sus
Ca niste-ntinse brate
N-au crengile de ce sa se agate
0000:0000 32 31 0D 0A 45 20 63 65 72 75 6C 20 73 75 73 0D
0000:0010 0A 43 61 20 6E 69 73 74 65 2D 6E 74 69 6E 73 65
0000:0020 20 62 72 61 74 65 0D 0A 4E 2D 61 75 20 63 72 65
0000:0030 6E 67 69 6C 65 20 64 65 20 63 65 20 73 61 20 73
0000:0040 65 20 61 67 61 74 65 0D 0A 1A
Sfarsitul de fisier (EOF) este marcat prin 1A.Sfarsitul de linie (EOL) este marcat prin 0D0A.
4.1.3 Codul sursa *
import java.io.*;
class Text
{
static int Max, nc;
static String[] s=new String[501]; // cuvintele din paragraf
static int[] lgc=new int[501]; // numarul caracterelor cuvintelorstatic int[] nsp=new int[501]; // numarul spatiilor dupa cuvant
static int cs=0, cd=0; // cs=cuvant stanga, cd=cuvant dreapta
static int lglin=0;
static PrintWriter out;
public static void main(String[] args) throws IOException
{
out=new PrintWriter(new BufferedWriter(new FileWriter("text.out")));
StreamTokenizer st=new StreamTokenizer(
new BufferedReader(new FileReader("text.in")));
st.eolIsSignificant(true);
st.nextToken(); Max=(int)st.nval;st.nextToken(); // preia EOL-ul existent dupa Max
while(st.nextToken()!=StreamTokenizer.TT_EOF)
{
nc=0;
-
7/25/2019 Algoritmi si structuri de date.pdf
130/402
120 CAPITOLUL 4. OJI 2003 CLASA A IX-A
do
{
s[++nc]=st.sval.toString();
} while(st.nextToken()!=StreamTokenizer.TT_EOL);
rezolva();
}
out.close();
}
static void rezolva() throws IOException
{
cs=0; // primul cuvant din linie (din stanga)
cd=0; // ultimul cuvant din linie (din stanga)
while(cd
-
7/25/2019 A