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)?
int f(int n) {
int c = 0;
while (n > 0) {
if (n % 2 == 1) c++;
n /= 2;
}
return c;
}- A)
9
- B)
11
- C)
4
- D)
8
Răspuns corect: A
Rezolvare pas cu pas
- La fiecare pas,
n % 2este ultima cifră a luinîn baza 2, iarn /= 2o elimină. - Deci funcția numără cifrele de 1 din scrierea binară a lui
n. - , adică .
- 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 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 , pentru că 2027 este impar).
Întrebarea 2
Ce valoare returnează apelul g(1071, 462)?
int g(int a, int b) {
if (b == 0) return a;
return g(b, a % b);
}- A)
7
- B)
42
- C)
21
- D)
147
Răspuns corect: C
Rezolvare pas cu pas
- Funcția este algoritmul lui Euclid recursiv, deci calculează .
- : → .
- → .
- → , care returnează .
De ce este corect C și de ce celelalte variante sunt greșite
C este corect: și , deci cmmdc este . 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?
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] << " ";- A)
1 3 4 7 8 9
- B)
3 1 8 4 7 9
- C)
3 8 1 9 4 7
- D)
1 3 8 4 7 9
Răspuns corect: B
Rezolvare pas cu pas
- Este o singură trecere a metodei bulelor, de la stânga la dreapta.
- : ? nu. : → interschimbare:
3 1 8 9 4 7. - : ? nu. : →
3 1 8 4 9 7. - : →
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?
int n = 10, cnt = 0;
for (int i = 1; i <= n; i++)
for (int j = i; j <= n; j++)
cnt++;- A)
100
- B)
45
- C)
50
- D)
55
Răspuns corect: D
Rezolvare pas cu pas
- Pentru un
ifixat,jia valorile , adică valori. - Totalul este .
- Pentru : .
De ce este corect D și de ce celelalte variante sunt greșite
D este corect: se numără perechile cu . A = ar fi corect dacă j ar porni mereu de la 1. B = numără doar perechile cu strict (ar corespunde lui j = i + 1). C = 50 = este o estimare care uită că perechile cu (10 la număr) se adaugă integral: .
Întrebarea 5
Ce se afișează după executarea secvenței? (se presupune inclusă biblioteca <cstring>)
char s[] = "informatica";
int k = 0;
for (int i = 0; s[i]; i++)
if (strchr("aeiou", s[i])) { s[i] = '*'; k++; }
cout << s << " " << k;- A)
nfrmtc* 5
- B)
nfrmtc* 4
- C)
infrmtc 5
- D)
nfrmtca 4
Răspuns corect: A
Rezolvare pas cu pas
strchr("aeiou", s[i])returnează un pointer nenul dacăs[i]este vocală.- Vocalele din
informaticasunt pe pozițiile 0 (i), 3 (o), 6 (a), 8 (i), 10 (a). - Fiecare este înlocuită cu
*șikcrește de 5 ori. - 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?
int x = 13;
cout << (x & 6) << " " << (x | 6) << " " << (x ^ 6);- A)
6 13 7
- B)
4 15 11
- C)
4 15 19
- D)
1 19 78
Răspuns corect: B
Rezolvare pas cu pas
- În binar: , .
- ȘI pe biți: .
- SAU pe biți: .
- SAU exclusiv: .
- 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 (, , ).
Întrebarea 7
Folosind metoda backtracking, se generează în ordine lexicografică toate permutările mulțimii . Prima este 1 2 3 4, a doua 1 2 4 3. Pe ce poziție se află permutarea 3 1 4 2?
- A)
13
- B)
15
- C)
14
- D)
16
Răspuns corect: C
Rezolvare pas cu pas
- Permutările care încep cu 1: (pozițiile 1–6). Cele care încep cu 2: încă 6 (pozițiile 7–12).
- Cu prefixul 3 urmează, în ordine:
3 1 2 4(13),3 1 4 2(14),3 2 1 4(15), ... - Deci
3 1 4 2este a 14-a permutare.
De ce este corect C și de ce celelalte variante sunt greșite
C este corect: înainte de ea sunt 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 . Câte componente conexe are graful?
- A)
2
- B)
3
- C)
4
- D)
5
Răspuns corect: B
Rezolvare pas cu pas
- Pornim o parcurgere (DFS/BFS) din fiecare nod nevizitat.
- Din 1 ajungem la 2 și 5: componenta .
- Din 3 ajungem la 4: componenta .
- Din 6 ajungem la 7 și 8: componenta (care conține un ciclu).
- 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: , , . A unește greșit două componente care nu au nicio muchie între ele. C = 4 ar rezulta dacă se omite muchia , 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:
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?
- A)
6
- B)
0
- C)
2
- D)
3
Răspuns corect: D
Rezolvare pas cu pas
- Pe diagonala principală , deci .
- : ; : ; : ; : .
- .
De ce este corect D și de ce celelalte variante sunt greșite
D este corect. A = 6 este suma 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 în loc de : .
Întrebarea 10
Câte apeluri ale funcției h (inclusiv apelul inițial) se execută pentru h(6)?
int h(int n) {
if (n <= 1) return 1;
return h(n - 1) + h(n - 2);
}- A)
13
- B)
25
- C)
21
- D)
64
Răspuns corect: B
Rezolvare pas cu pas
- Notăm numărul de apeluri pentru
h(n). Avem și . - , , , .
- .
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 = presupune un arbore de apeluri complet, dar ramura h(n - 2) este mai scurtă.