Documente Academic
Documente Profesional
Documente Cultură
1 subprogram F(u, v)
2 (u, v - numere naturale)
3 dacă u = v sau u = 0 sau v = 0 atunci
4 returnează max(u, v)
5 altfel dacă u % 2 = 0 atunci
6 dacă v % 2 = 0 atunci
7 returnează 2 * F(u / 2, v / 2)
8 altfel
9 returnează F(u / 2, v)
10 altfel
11 dacă v % 2 = 0 atunci
12 returnează F(u, v / 2)
13 altfel
14 dacă u < v atunci
15 returnează F(u, (v - u) / 2)
16 altfel
17 returnează F((u - v) / 2, v)
1 #include <iostream>
2 #define SMAX 101 // Fie 100 lungimea maximă a șirului inițial.
3
4 using namespace std;
5
6 int cnt; // numărul de transformări aplicate
7 char str[SMAX]; // șirul dat
8
9 // matrice cu regulile de transformare
10 char R[8][4] = {"aaa", "aaa", "aab", "aba", "abb", "aba", "baa", "bab"};
11
12 int main() {
13 bool ok;
14 int i, ind;
15
16 // Citim și validăm șirul:
17 cin >> str;
18 for (i = 0; str[i]; i++)
19 if (str[i] != 'a' && str[i] != 'b') {
20 cout << "Date invalide\n";
21 return 0;
22 }
23
24 // Aplicăm transformările:
25 do {
26 ok = false;
27 for (i = 2; str[i]; i++) { // Căutăm o secvență de lungime 3 pe care o putem transforma.
28 ind = (str[i] - 'a') + 2 * (str[i - 1] - 'a') + 4 * (str[i - 2] - 'a');
29 str[i - 2] = R[ind][0]; str[i - 1] = R[ind][1]; str[i] = R[ind][2];
30 if (ind) { // Dacă secvența nu era "aaa":
31 cnt++;
32 ok = true;
33 }
34 }
35 } while (ok);
36
37 // Afișăm numărul de transformări efectuate,
38 // și verificăm dacă toate caracterele șirului curent sunt 'a':
39
40 cout << cnt << '\n';
41 for (i = 0; str[i]; i++)
42 if (str[i] != 'a') {
43 cout << "Sirul final nu este format doar din caractere egale cu a.\n";
44 return 0;
45 }
46
47 cout << "Sirul final este format doar din caractere egale cu a.\n";
48 return 0;
49 }
b) Scrieți o funcție C++ care primește ca argumente numărul natural impar nn și două
tablouri de caractere, reprezentând mulțimile SS și TT, și construiesc un (S,T)(S,T)-
pătrat.
Cum în enunț matricea pe care trebuie să o construim nu este inclusă în lista de parametri,
iar funcțiile nu pot returna tablouri, am declarat global o matrice mat. Aceasta conține
elemente de tipul Pair, care este un struct definit de mine cu două câmpuri: x și y. În rest
nu prea am ce comenta, funcția fconstruiește matricea exact după procedeul descris la
cerința anterioară.
Am îngroșat diagonala pe care se află litera cc. Cifrele de pe această diagonală apar de sus
în jos în ordinea 2,4,1,3,02,4,1,3,0. După 44 urmează 11 și după 33 urmează 00 pentru
că parcurgerea lui TT se ia de la capăt când se ajunge la final. Cum nn-ul este impar și
cifrele cresc din 22 în 22, ele nu se vor repeta. Dacă în schimb nn-ul ar fi fost par, să
zicem 44, cifrele ar fi fost 2,0,2,02,0,2,0, așa că (cel puțin) strategia noastră de
completare a matricei n-ar mai fi funcționat.
Subiectul III. Problema 1.
Se consideră toate șirurile de lungime 10 formate din 0 și 1. Câte dintre acestea au
proprietatea că suma oricăror 5 elemente de pe poziții consecutiive este 3?
A. 10
B. 100
C. 120
D. 1024
Ideea de bază este că dacă avem fixați primii 5 termeni ai șirului, celelalte elemente sunt
determnate în mod unic: Analizăm pe rând fiecare secvență de lungime 5. Observăm că
pentru a trece de la o secvență la următoarea, trebuie să eliminăm primul element din
stânga și să inserăm unul nou la dreapta, astfel încât suma elementelor noii secvențe să
fie 3. Dacă elementul eliminat este 1, suma elementelor rămase devine 2, așa că trebuie să
adăugăm neapărat 1 pentru a reveni la suma 3. Dacă elementul eliminat este 0, suma
rămâne 3, așa că trebuie să adăugăm tot 0, pentru a nu o modfica.
Acum că am demonstrat asta, putem spune că numărul de șiruri cu proprietatea dată este
egal cu numărul de șiruri binare de lungime 5, cu suma elementelor 3. Adică numărul de
șiruri de lungime 5formate din 3 elemente de 1 și 2 elemente de 0. Acesta este egal
cu C35=10C53=10. Prin urmare, varianta corectă este A.
Subiectul III. Problema 2.
John McCarthy, unul dintre fondatorii domeniului inteligență artificială, a propus
funcția F91, definită mai jos și numită funcția 91 a lui McCarthy. Ce valoare va returna
apelul F91(91)?
1 int F91(int x) {
2 if (x > 100)
3 return x - 10;
4 else
5 return F91(F91(x + 11));
6 }