Subiect și barem BAC 2026 Informatică C/C++ (științe ale naturii)
2026
Sesiune specială
Varianta 4
Rezolvare explicată

Rezolvare BAC 2026 Informatică C/C++ (științe ale naturii) — Sesiune specială, varianta 4

Rezolvarea completă a subiectului de Bacalaureat 2026 la Informatică, limbajul C/C++, profil științe ale naturii, sesiunea specială, varianta 4. Pentru fiecare item ai răspunsul, raționamentul pas cu pas, codul C++ complet și punctajul din baremul oficial.

Sfat: încearcă întâi singur fiecare cerință, apoi verifică aici. La programe, baremul punctează orice soluție corectă — nu trebuie să scrii exact codul de mai jos.

Subiectul I (20 de puncte)

Răspunsuri: 1 – d, 2 – b, 3 – a, 4 – d, 5 – c (câte 4 puncte).

1. Expresia egală cu 26 → d. 2026%100

Restul împărțirii la 100 dă ultimele două cifre: 2026%100 = 26.

  • a. (2026-26)/100 = 2000/100 = 20.
  • b. 2026/100 = 20 (împărțire întreagă).
  • c. (2026-26)%100 = 2000%100 = 0.

2. 9 se compară cu 4 elemente din B → b. (4,5,6,10,13)

La interclasarea crescătoare, elementul 9 din A rămâne „curent” cât timp elementele din B sunt mai mici decât el (ele trec în rezultat), iar comparațiile se opresc la primul element din B mai mare decât 9. Deci în B trebuie să fie exact 3 valori mai mici decât 9, urmate de o valoare mai mare.

  • b. 9 se compară cu 4, 5, 6 (trec în rezultat) și cu 10 → 9 trece în rezultat: 4 comparații ✔.
  • a. toate valorile din B sunt < 9 → 5 comparații.
  • c, d. doar 2 valori < 9 (4, 7 respectiv 4, 8) → 3 comparații.

3. ceil(20.26) → a. 21

ceil rotunjește în sus, la cel mai mic întreg ≥ argumentul: 21. Varianta b (20) ar fi floor, iar c, d nu sunt întregi.

4. r = 2^26 → d. n=n*n; e=e/2;

Este exponențierea rapidă: privim exponentul în baza 2. La fiecare pas, dacă bitul curent al lui e este 1, înmulțim r cu n; apoi n devine n2n^2 (puterea corespunzătoare bitului următor) și e se înjumătățește.

Pentru e=26=110102e = 26 = 11010_2: n ia valorile 2,22,24,28,2162, 2^2, 2^4, 2^8, 2^{16}, iar r = 22⋅28⋅216=2262^2 \cdot 2^8 \cdot 2^{16} = 2^{26} ✔.

  • a, b. n=n/2 micșorează baza. Greșit.
  • c. n=n*n; e=e-1 ar ridica baza la puteri uriașe, nu la 2262^{26}.

5. Pachetul de dinainte de (Predeal, Venus) → c. (Păltiniș, Olimp)

Cele două bucle generează perechile (i, j) în ordinea: (1,1), (1,2), (1,3), (2,1), (2,2), (2,3), (3,1), … (Predeal, Venus) = (3,1), iar înaintea lui este (2,3) = (Păltiniș, Olimp).

Subiectul al II-lea (40 de puncte)

1. Algoritmul în pseudocod

Pentru fiecare d cu d2≤nd^2 \le n, bucla interioară împarte n la d cât timp se poate; p devine 1 dacă d a fost divizor. Așadar nr numără factorii primi distincți ai lui n. Ce rămâne la final (n ≠ 1) este un ultim factor prim, mai mare decât n\sqrt{n}, care se adaugă și el.

a) Pentru n = 2600 → 3

2600=23⋅52⋅132600 = 2^3 \cdot 5^2 \cdot 13.

dCe se întâmplăn dupănr
2se împarte de 3 ori3251
3, 4nu divid3251
5se împarte de 2 ori132
636>1336 > 13 → stop132

n = 13 ≠ 1 → nr = 3. Se afișează 3. (6p)

b) Două numere din [10, 99] pentru care se afișează 1

Trebuie un singur factor prim, adică numere de forma xkx^k, cu x prim: de exemplu 11 și 16 (alte variante: 13, 25, 27, 32, 49, 81 …). (câte 3p)

c) Programul C/C++ (10p)

cppcod
#include <iostream> using namespace std; int main() { int n, nr = 0, d = 2, p; cin >> n; while (d * d <= n) { p = 0; while (n % d == 0) { p = 1; n = n / d; } nr = nr + p; d = d + 1; } if (n != 1) nr = nr + 1; cout << nr; return 0; }

d) A doua structură „cât timp” înlocuită cu test final (6p)

O structură cu test final execută corpul cel puțin o dată, însă aici d poate să nu fie divizor deloc. De aceea o punem într-un dacă, care tratează cazul inițial n%d = 0:

textcod
citește n (număr natural nenul) nr ← 0; d ← 2 ┌cât timp d*d ≤ n execută │ p ← 0 │ ┌dacă n%d = 0 atunci │ │ ┌repetă │ │ │ p ← 1; n ← [n/d] │ │ └până când n%d ≠ 0 │ └■ │ nr ← nr + p; d ← d + 1 └■ ┌dacă n ≠ 1 atunci │ nr ← nr + 1 └■ scrie nr

2. Căutare binară cu comparațiile 26, 16, 21 (6p)

Tabloul (10, 16, 21, 26, 32, 38, 50), pozițiile 1..7:

  1. mijlocul = poziția 4 → 26; ca să mergem la stânga, x<26x < 26;
  2. intervalul 1..3, mijlocul = poziția 2 → 16; ca să mergem la dreapta, x>16x > 16;
  3. intervalul 3..3 → 21, ultima comparație.

Deci x poate fi orice număr din [17, 25], de exemplu 17 și 21. (câte 3p)

3. Clasificarea stelei după distanță (6p)

Magnitudinea este număr real, deci o declarăm float (sau double):

cppcod
float magnitudine; if (distanta < 100) cout << "aproape"; else if (distanta >= 1000) cout << "departe"; else cout << "medie";

Barem: declarare 1p, mesaje și corelarea lor cu cazurile 4p, corectitudine 1p.

Subiectul al III-lea (30 de puncte)

1. Numărul de ordine al primului costum — pseudocod (10p)

Ne interesează prima cifră pară de la stânga. Parcurgând cifrele de la dreapta la stânga, numărăm cifrele (k) și reținem în poz poziția (numărată de la dreapta) a ultimei cifre pare întâlnite — aceasta este prima din stânga. La final, numărul de ordine de la stânga este k−poz+1k - poz + 1.

Folosim o structură cu test final ca să tratăm corect și n = 0 (o singură cifră, 0, pară).

textcod
citește n (număr natural) k ← 0; poz ← 0 ┌repetă │ k ← k + 1 │ ┌dacă n%10%2 = 0 atunci │ │ poz ← k │ └■ │ n ← [n/10] └până când n = 0 scrie k − poz + 1

Verificare: n = 576798 → k = 6, ultima cifră pară întâlnită (de la dreapta) este 6, pe poziția 4 → 6−4+1=36 - 4 + 1 = 3 ✔. n = 5700 → k = 4, cifra 0 de pe poziția 2 → 4−2+1=34 - 2 + 1 = 3 ✔.

2. Interschimbarea minimului (10p)

Determinăm poziția pmin a minimului. Dacă minimul este par, îl interschimbăm cu primul element; dacă este impar, cu ultimul.

cppcod
#include <iostream> using namespace std; int main() { int n, v[51], i, pmin = 1, aux; cin >> n; for (i = 1; i <= n; i++) cin >> v[i]; for (i = 2; i <= n; i++) if (v[i] < v[pmin]) pmin = i; int poz; // poziția cu care interschimbăm if (v[pmin] % 2 == 0) poz = 1; else poz = n; aux = v[pmin]; v[pmin] = v[poz]; v[poz] = aux; for (i = 1; i <= n; i++) cout << v[i] << ' '; return 0; }

Verificare: (8, 6, 2, 2, 7, 4) → minimul 2 (par, poziția 3) ↔ primul → 2 6 8 2 7 4 ✔; (8, 6, 1, 2, 7, 4) → minimul 1 (impar) ↔ ultimul → 8 6 4 2 7 1 ✔.

3. Pachetele livrate, în ordine descrescătoare

a) Descrierea algoritmului (2p)

Relația șirului este ak+1=2ak+1a_{k+1} = 2a_k + 1 (pornind de la 3), deci, mergând înapoi, ak=[(ak+1−1)/2]a_k = [(a_{k+1} - 1)/2]. Scriem valoarea citită, apoi calculăm pe rând termenul anterior cu această formulă, cât timp valoarea este mai mare decât 3. Excepția este începutul șirului: înaintea lui 3 vine 0 (nu 1), așa că după 3 scriem direct 0. Dacă se citește 0, se scrie doar 0.

Eficiență: valorile se înjumătățesc la fiecare pas → doar O(log⁡n)O(\log n) pași (cel mult ~30 pentru 10910^9); nu memorăm șirul, ci o singură variabilă → memorie O(1).

b) Programul C/C++ (8p)

cppcod
#include <fstream> #include <iostream> using namespace std; int main() { ofstream g("bac.txt"); int y; cin >> y; while (y > 3) { g << y << ' '; y = (y - 1) / 2; } if (y == 3) g << 3 << ' '; g << 0; g.close(); return 0; }

Verificare: 127 → 127 63 31 15 7 3 0 ✔; 0 → 0; 3 → 3 0.

Ce merită reținut din varianta 4

  • %100 dă ultimele două cifre, /100 le elimină.
  • ceil rotunjește în sus, floor în jos.
  • Exponențiere rapidă: if(e%2) r*=n; n*=n; e/=2;.
  • Factori primi distincți: împarte cât timp se poate și nu uita factorul rămas > √n.
  • Șir recurent parcurs invers: inversează formula (ak=(ak+1−1)/2a_k = (a_{k+1}-1)/2) și tratează separat primii termeni.

Alte subiecte Informatică C/C++ (științe ale naturii) rezolvate

Reclamă