Subiect rezolvat · Informatică

Subiecte admitere UBB Informatică 2027 — 10 grile rezolvate C++

Aceasta este o **variantă de antrenament** scrisă de noi, nu un subiect oficial al Facultății de Matematică și Informatică a UBB Cluj. Conform regulamentului de admitere publicat de facultate pentru 2025, proba scrisă la Informatică este un test grilă cu 24 de întrebări, cu durata de 3 ore, iar o întrebare poate avea mai multe variante corecte (se punctează parțial, cu penalizare pentru variantele greșite bifate). Aici, pentru exersare rapidă, fiecare dintre cele 10 grile are exact un răspuns corect. Temele urmează programa de la admitere — algoritmi elementari, recursivitate, șiruri de caractere, operații pe biți, tablouri, backtracking, grafuri — iar tot codul este scris în C++ și a fost compilat și rulat pentru verificare. Verifică regulamentul pentru 2027 pe site-ul facultății, deoarece formatul se poate schimba.

Întrebarea 1

Ce valoare returnează apelul f(2027)?

cppcod
int f(int n) { int c = 0; while (n > 0) { if (n % 2 == 1) c++; n /= 2; } return c; }
  1. A)

    9

  2. B)

    11

  3. C)

    4

  4. D)

    8

Răspuns corect: A

Rezolvare pas cu pas

  1. La fiecare pas, n % 2 este ultima cifră a lui n în baza 2, iar n /= 2 o elimină.
  2. Deci funcția numără cifrele de 1 din scrierea binară a lui n.
  3. 2027=1024+512+256+128+64+32+8+2+12027 = 1024 + 512 + 256 + 128 + 64 + 32 + 8 + 2 + 1, adică 2027=11111101011(2)2027 = 11111101011_{(2)}.
  4. Cifrele de 1 sunt 9, deci f(2027) = 9.

De ce este corect A și de ce celelalte variante sunt greșite

A este corect: în 11111101011(2)11111101011_{(2)} apar nouă cifre de 1. B = 11 este numărul total de cifre binare (lungimea scrierii), nu numărul de cifre 1. C = 4 ar fi numărul de cifre zecimale ale lui 2027. D = 8 omite unul dintre biții de 1 (de obicei 202^0, pentru că 2027 este impar).

Întrebarea 2

Ce valoare returnează apelul g(1071, 462)?

cppcod
int g(int a, int b) { if (b == 0) return a; return g(b, a % b); }
  1. A)

    7

  2. B)

    42

  3. C)

    21

  4. D)

    147

Răspuns corect: C

Rezolvare pas cu pas

  1. Funcția este algoritmul lui Euclid recursiv, deci calculează cmmdc(a,b)\text{cmmdc}(a, b).
  2. g(1071,462)g(1071, 462): 1071 mod 462=1471071 \bmod 462 = 147 → g(462,147)g(462, 147).
  3. 462 mod 147=21462 \bmod 147 = 21 → g(147,21)g(147, 21).
  4. 147 mod 21=0147 \bmod 21 = 0 → g(21,0)g(21, 0), care returnează 2121.

De ce este corect C și de ce celelalte variante sunt greșite

C este corect: 1071=32⋅7⋅171071 = 3^2 \cdot 7 \cdot 17 și 462=2⋅3⋅7⋅11462 = 2 \cdot 3 \cdot 7 \cdot 11, deci cmmdc este 3⋅7=213 \cdot 7 = 21. A = 7 este doar un divizor comun, nu cel mai mare. B = 42 nu divide 1071 (1071 este impar). D = 147 este un rest intermediar, nu rezultatul final.

Întrebarea 3

Ce se afișează după executarea secvenței?

cppcod
int v[] = {3, 8, 1, 9, 4, 7}, n = 6; for (int i = 1; i < n; i++) if (v[i] < v[i - 1]) swap(v[i], v[i - 1]); for (int i = 0; i < n; i++) cout << v[i] << " ";
  1. A)

    1 3 4 7 8 9

  2. B)

    3 1 8 4 7 9

  3. C)

    3 8 1 9 4 7

  4. D)

    1 3 8 4 7 9

Răspuns corect: B

Rezolvare pas cu pas

  1. Este o singură trecere a metodei bulelor, de la stânga la dreapta.
  2. i=1i=1: 8<38 < 3? nu. i=2i=2: 1<81 < 8 → interschimbare: 3 1 8 9 4 7.
  3. i=3i=3: 9<89 < 8? nu. i=4i=4: 4<94 < 9 → 3 1 8 4 9 7.
  4. i=5i=5: 7<97 < 9 → 3 1 8 4 7 9. Se afișează 3 1 8 4 7 9.

De ce este corect B și de ce celelalte variante sunt greșite

B este corect: o singură trecere duce doar maximul (9) la final. A este vectorul complet sortat, care ar necesita mai multe treceri. C este vectorul inițial, ca și cum nu s-ar face nicio interschimbare. D presupune că 1 ajunge pe prima poziție, dar el se mută doar cu un pas spre stânga, pentru că 3 nu mai este comparat a doua oară.

Întrebarea 4

Ce valoare are cnt după executarea secvenței?

cppcod
int n = 10, cnt = 0; for (int i = 1; i <= n; i++) for (int j = i; j <= n; j++) cnt++;
  1. A)

    100

  2. B)

    45

  3. C)

    50

  4. D)

    55

Răspuns corect: D

Rezolvare pas cu pas

  1. Pentru un i fixat, j ia valorile i,i+1,…,ni, i+1, \dots, n, adică n−i+1n - i + 1 valori.
  2. Totalul este ∑i=1n(n−i+1)=n+(n−1)+⋯+1=n(n+1)2\sum_{i=1}^{n} (n - i + 1) = n + (n-1) + \dots + 1 = \frac{n(n+1)}{2}.
  3. Pentru n=10n = 10: 10⋅112=55\frac{10 \cdot 11}{2} = 55.

De ce este corect D și de ce celelalte variante sunt greșite

D este corect: se numără perechile (i,j)(i, j) cu 1≤i≤j≤101 \le i \le j \le 10. A = 10210^2 ar fi corect dacă j ar porni mereu de la 1. B = C102C_{10}^2 numără doar perechile cu i<ji < j strict (ar corespunde lui j = i + 1). C = 50 = n22\frac{n^2}{2} este o estimare care uită că perechile cu i=ji = j (10 la număr) se adaugă integral: 100−102+10=55\frac{100 - 10}{2} + 10 = 55.

Întrebarea 5

Ce se afișează după executarea secvenței? (se presupune inclusă biblioteca <cstring>)

cppcod
char s[] = "informatica"; int k = 0; for (int i = 0; s[i]; i++) if (strchr("aeiou", s[i])) { s[i] = '*'; k++; } cout << s << " " << k;
  1. A)

    nfrmtc* 5

  2. B)

    nfrmtc* 4

  3. C)

    infrmtc 5

  4. D)

    nfrmtca 4

Răspuns corect: A

Rezolvare pas cu pas

  1. strchr("aeiou", s[i]) returnează un pointer nenul dacă s[i] este vocală.
  2. Vocalele din informatica sunt pe pozițiile 0 (i), 3 (o), 6 (a), 8 (i), 10 (a).
  3. Fiecare este înlocuită cu * și k crește de 5 ori.
  4. Se afișează *nf*rm*t*c* 5.

De ce este corect A și de ce celelalte variante sunt greșite

A este corect: toate cele 5 vocale devin *. B are șirul bun, dar numără greșit (uită o vocală). C ar corespunde ștergerii vocalelor, însă codul le înlocuiește, nu le elimină. D ar rezulta dacă bucla s-ar opri înainte de ultimul caracter (de exemplu, cu condiția s[i + 1]).

Întrebarea 6

Ce afișează secvența următoare?

cppcod
int x = 13; cout << (x & 6) << " " << (x | 6) << " " << (x ^ 6);
  1. A)

    6 13 7

  2. B)

    4 15 11

  3. C)

    4 15 19

  4. D)

    1 19 78

Răspuns corect: B

Rezolvare pas cu pas

  1. În binar: 13=1101(2)13 = 1101_{(2)}, 6=0110(2)6 = 0110_{(2)}.
  2. ȘI pe biți: 1101 & 0110=0100(2)=41101 \,\&\, 0110 = 0100_{(2)} = 4.
  3. SAU pe biți: 1101∣0110=1111(2)=151101 \mid 0110 = 1111_{(2)} = 15.
  4. SAU exclusiv: 1101⊕0110=1011(2)=111101 \oplus 0110 = 1011_{(2)} = 11.
  5. Se afișează 4 15 11.

De ce este corect B și de ce celelalte variante sunt greșite

B este corect după calculul bit cu bit. A presupune greșit că & și | returnează unul dintre operanzi (6, respectiv 13), ceea ce nu e adevărat pe biți. C are x ^ 6 = 19 = 13 + 6, adică confundă XOR cu adunarea. D confundă operatorii pe biți cu operații aritmetice (13 mod 6=113 \bmod 6 = 1, 13+6=1913 + 6 = 19, 13⋅6=7813 \cdot 6 = 78).

Întrebarea 7

Folosind metoda backtracking, se generează în ordine lexicografică toate permutările mulțimii {1,2,3,4}\{1, 2, 3, 4\}. Prima este 1 2 3 4, a doua 1 2 4 3. Pe ce poziție se află permutarea 3 1 4 2?

  1. A)

    13

  2. B)

    15

  3. C)

    14

  4. D)

    16

Răspuns corect: C

Rezolvare pas cu pas

  1. Permutările care încep cu 1: 3!=63! = 6 (pozițiile 1–6). Cele care încep cu 2: încă 6 (pozițiile 7–12).
  2. Cu prefixul 3 urmează, în ordine: 3 1 2 4 (13), 3 1 4 2 (14), 3 2 1 4 (15), ...
  3. Deci 3 1 4 2 este a 14-a permutare.

De ce este corect C și de ce celelalte variante sunt greșite

C este corect: înainte de ea sunt 6+6+1=136 + 6 + 1 = 13 permutări. A = 13 este poziția lui 3 1 2 4, imediat anterioară. B = 15 este poziția lui 3 2 1 4. D = 16 ar fi 3 2 4 1, rezultat al numărării greșite a permutărilor cu prefixul 3 2.

Întrebarea 8

Un graf neorientat are 8 noduri, numerotate de la 1 la 8, și muchiile [1,2],[2,5],[3,4],[6,7],[7,8],[8,6][1,2], [2,5], [3,4], [6,7], [7,8], [8,6]. Câte componente conexe are graful?

  1. A)

    2

  2. B)

    3

  3. C)

    4

  4. D)

    5

Răspuns corect: B

Rezolvare pas cu pas

  1. Pornim o parcurgere (DFS/BFS) din fiecare nod nevizitat.
  2. Din 1 ajungem la 2 și 5: componenta {1,2,5}\{1, 2, 5\}.
  3. Din 3 ajungem la 4: componenta {3,4}\{3, 4\}.
  4. Din 6 ajungem la 7 și 8: componenta {6,7,8}\{6, 7, 8\} (care conține un ciclu).
  5. Toate cele 8 noduri sunt acoperite, deci sunt 3 componente conexe.

De ce este corect B și de ce celelalte variante sunt greșite

B este corect: {1,2,5}\{1,2,5\}, {3,4}\{3,4\}, {6,7,8}\{6,7,8\}. A unește greșit două componente care nu au nicio muchie între ele. C = 4 ar rezulta dacă se omite muchia [3,4][3,4], considerând nodurile 3 și 4 izolate. D = 5 ar presupune că nodurile 6, 7, 8 nu sunt toate legate.

Întrebarea 9

Se construiește matricea a cu 4 linii și 4 coloane (indexate de la 0) astfel:

cppcod
int a[4][4], s = 0; for (int i = 0; i < 4; i++) for (int j = 0; j < 4; j++) a[i][j] = (i + j) % 3; for (int i = 0; i < 4; i++) s += a[i][i];

Ce valoare are s la final?

  1. A)

    6

  2. B)

    0

  3. C)

    2

  4. D)

    3

Răspuns corect: D

Rezolvare pas cu pas

  1. Pe diagonala principală i=ji = j, deci a[i][i]=2i mod 3a[i][i] = 2i \bmod 3.
  2. i=0i = 0: 00; i=1i = 1: 22; i=2i = 2: 4 mod 3=14 \bmod 3 = 1; i=3i = 3: 6 mod 3=06 \bmod 3 = 0.
  3. s=0+2+1+0=3s = 0 + 2 + 1 + 0 = 3.

De ce este corect D și de ce celelalte variante sunt greșite

D este corect. A = 6 este suma 0+1+2+30+1+2+3 a indicilor (sau numărul de zerouri din matrice), nu suma de pe diagonală. B = 0 ar fi corect dacă toate elementele diagonalei ar fi multipli de 3. C = 2 se obține dacă se calculează greșit (i⋅j) mod 3(i \cdot j) \bmod 3 în loc de (i+j) mod 3(i + j) \bmod 3: 0+1+1+0=20 + 1 + 1 + 0 = 2.

Întrebarea 10

Câte apeluri ale funcției h (inclusiv apelul inițial) se execută pentru h(6)?

cppcod
int h(int n) { if (n <= 1) return 1; return h(n - 1) + h(n - 2); }
  1. A)

    13

  2. B)

    25

  3. C)

    21

  4. D)

    64

Răspuns corect: B

Rezolvare pas cu pas

  1. Notăm c(n)c(n) numărul de apeluri pentru h(n). Avem c(0)=c(1)=1c(0) = c(1) = 1 și c(n)=1+c(n−1)+c(n−2)c(n) = 1 + c(n-1) + c(n-2).
  2. c(2)=3c(2) = 3, c(3)=5c(3) = 5, c(4)=9c(4) = 9, c(5)=15c(5) = 15.
  3. c(6)=1+15+9=25c(6) = 1 + 15 + 9 = 25.

De ce este corect B și de ce celelalte variante sunt greșite

B este corect după recurența numărului de apeluri. A = 13 este valoarea returnată de h(6), nu numărul de apeluri. C = 21 este un termen Fibonacci apropiat, fără apelul curent adăugat la fiecare nivel. D = 262^6 presupune un arbore de apeluri complet, dar ramura h(n - 2) este mai scurtă.

Exersează Informatică