Bac informatică 2026 Model, rezolvată

Lucrarea „2026 Model” de la Bacalaureatul la informatică, specializarea Mate-Info, limbajul C/C++: 3 subiecte, 90 de puncte și 3 ore de lucru la examen. Sub fiecare exercițiu ai răspunsul și explicația, închise până le deschizi, ca să încerci întâi singur.

Enunțurile sunt cele oficiale, publicate de Ministerul Educației pe subiecte.edu.ro. Răspunsurile și explicațiile sunt scrise de subac.

Subiectul I20 de puncte

  1. Exercițiul 14p

    Indicați valoarea expresiei C/C++ alăturate.

    20/25*20/2
    • a)0
    • b)0.02
    • c)0.08
    • d)8
    Arată răspunsul și explicația

    Răspuns corect: a) 0

    / și * au aceeași prioritate și se aplică de la stânga la dreapta. 20/25 este o împărțire între numere întregi, deci dă câtul, 0. Apoi 0*20 este 0, iar 0/2 este tot 0.

    b) și c) ar presupune o împărțire cu zecimale, iar d) o altă ordine a operațiilor.

  2. Exercițiul 24p

    Subprogramul f este definit alăturat.

    Știind că variabila x memorează un tablou unidimensional cu elementele (2,0,2,6,8), în această ordine, numerotate de la 0 la 4, indicați valoarea f(0,4,x).

    int f(int s,int d,int v[])
    { if(s==d) if(v[d]==2*d)return 1;
                 else return 0;
      else return f(s,(s+d)/2,v) + f(1+(s+d)/2,d,v);
    }
    • a)1
    • b)2
    • c)4
    • d)5
    Arată răspunsul și explicația

    Răspuns corect: b) 2

    Funcția împarte intervalul de poziții în două jumătăți până ajunge la câte o singură poziție d și numără pozițiile pentru care v[d]==2*d.

    Pentru (2,0,2,6,8): v[0]=2≠0, v[1]=0≠2, v[2]=2≠4, v[3]=6=6, v[4]=8=8. Două poziții îndeplinesc condiția, deci f(0,4,x) = 2.

  3. Exercițiul 34p

    La un târg pentru copii, fiecare joc este asociat cu câte o singură abilitate – cheie, dintre cele pe care le poate dezvolta. Utilizând metoda backtracking, se generează toate posibilitățile de a expune seturi de câte trei jocuri din mulțimea {jenga (motricitate), kendama (motricitate), lego (creativitate), șah (strategie), scrabble (vocabular)}, astfel încât să nu fie alese simultan două jocuri care dezvoltă aceeași abilitate - cheie, scrabble să NU apară pe prima poziție, iar șahul să NU fie înainte de jenga sau kendama. Două seturi sunt distincte dacă diferă prin cel puțin un joc sau dacă ordinea jocurilor este diferită. Primele cinci seturi generate sunt, în această ordine:

    1. (jenga, lego, șah)
    2. (jenga, lego, scrabble)
    3. (jenga, șah, lego)
    4. (jenga, șah, scrabble)
    5. (jenga, scrabble, lego)

    Indicați penultimul set generat.

    • a)șah, lego, scrabble
    • b)șah, scrabble, lego
    • c)lego, jenga, șah
    • d)lego, șah, jenga
    Arată răspunsul și explicația

    Răspuns corect: a) șah, lego, scrabble

    Seturile se generează în ordinea din mulțime: jenga, kendama, lego, șah, scrabble, deci ultimele sunt cele care încep cu cel mai târziu joc permis pe prima poziție. scrabble nu poate fi primul, așa că ultimele seturi încep cu șah.

    Dacă șah este primul, jenga și kendama nu mai pot apărea după el, deci celelalte două jocuri sunt lego și scrabble: întâi (șah, lego, scrabble), apoi (șah, scrabble, lego), ultimul set. Penultimul este (șah, lego, scrabble).

  4. Exercițiul 44p

    Variabila z, declarată alăturat, memorează unele date despre 100 dintre zonele continentului.

    Știind că densitatea unei zone este egală cu raportul dintre numărul de locuitori și suprafața acesteia (exprimată în km2), indicați o expresie a cărei valoare este egală cu numărul de locuitori ai primei zone.

    struct zona
    { char nume[21];
      int densitate;
      int suprafata;
    }z[100];
    • a)z[0].densitate*z[0].suprafata
    • b)z.densitate[0]*z.suprafata[0]
    • c)densitate[0].z*suprafata[0].z
    • d)densitate.z[0]*suprafata.z[0]
    Arată răspunsul și explicația

    Răspuns corect: a) z[0].densitate*z[0].suprafata

    z este un tablou de structuri, deci prima zonă este z[0], iar câmpurile ei se accesează cu punct: z[0].densitate și z[0].suprafata. Densitatea este numărul de locuitori împărțit la suprafață, deci numărul de locuitori este produsul lor.

    b), c) și d) pun indicele sau numele variabilei în locuri greșite și nu sunt expresii C/C++ valide.

  5. Exercițiul 54p

    Un graf neorientat are 7 noduri, numerotate de la 1 la 7, și 8 muchii, dintre care șase sunt:

    1. [1,2]
    2. [2,5]
    3. [2,6]
    4. [2,7]
    5. [3,7]
    6. [4,7]

    Știind că unul dintre lanțurile elementare care au lungimea maximă este 3, 7, 4, 5, 2, 1, indicați care ar putea fi celelalte două muchii ale grafului.

    • a)[1,6] și [4,5]
    • b)[2,3] și [2,4]
    • c)[2,3] și [4,5]
    • d)[2,4] și [5,7]
    Arată răspunsul și explicația

    Răspuns corect: c) [2,3] și [4,5]

    Lanțul 3, 7, 4, 5, 2, 1 folosește muchiile [3,7], [7,4], [4,5], [5,2] și [2,1]. Dintre ele, doar [4,5] nu se află printre cele șase date, deci este una dintre muchiile lipsă. Rămân variantele a) și c).

    În a), muchia [1,6] ar prelungi lanțul: 3, 7, 4, 5, 2, 1, 6 are lungimea 6, deci lanțul dat n-ar mai avea lungime maximă. În c), nodurile 1 și 6 au un singur vecin, pe 2, deci nu pot fi amândouă capete ale unui lanț prin toate cele 7 noduri: lungimea maximă rămâne 5.

Subiectul al II-lea40 de puncte

  1. Exercițiul 1.a6p

    Algoritmul alăturat este reprezentat în pseudocod.

    Scrieți ce se afișează în urma executării algoritmului dacă se citesc, în această ordine, valorile 27 și 38.

    citește m,n
      (numere naturale, 1<m<n)
    ┌repetă
    │ x←m; y←n; n←n-1
    │┌repetă
    ││┌dacă x>y atunci x←x-y
    │││altfel y←y-x
    ││└■
    │└până când y=0
    └până când x≠1
     scrie n+1
    Arată răspunsul și explicația

    Răspunsul din barem: 36

    36
    
    Al doilea repetă calculează, prin scăderi repetate, cel mai mare divizor comun al lui m și al valorii curente a lui n, iar primul repetă se oprește când acesta nu mai este 1. Se afișează n+1, adică exact valoarea verificată ultima, fiindcă n fusese deja micșorat.
    Pentru m=27: cmmdc(27,38)=1, cmmdc(27,37)=1, cmmdc(27,36)=9, deci se afișează 36.
  2. Exercițiul 1.b6p

    Algoritmul alăturat este reprezentat în pseudocod.

    Dacă pentru variabila m se citește numărul 5, scrieți două valori care pot fi citite pentru variabila n astfel încât, în urma executării algoritmului, pentru fiecare dintre acestea, valoarea afișată să fie 10.

    citește m,n
      (numere naturale, 1<m<n)
    ┌repetă
    │ x←m; y←n; n←n-1
    │┌repetă
    ││┌dacă x>y atunci x←x-y
    │││altfel y←y-x
    ││└■
    │└până când y=0
    └până când x≠1
     scrie n+1
    Arată răspunsul și explicația
    Exemplu: 10 și 14
    
    Pentru m=5, se afișează primul număr care se împarte la 5, coborând de la n. Acesta este 10 pentru orice n de la 10 la 14; pentru n=15 s-ar afișa chiar 15.
  3. Exercițiul 1.c10p

    Algoritmul alăturat este reprezentat în pseudocod.

    Scrieți programul C/C++ corespunzător algoritmului dat.

    citește m,n
      (numere naturale, 1<m<n)
    ┌repetă
    │ x←m; y←n; n←n-1
    │┌repetă
    ││┌dacă x>y atunci x←x-y
    │││altfel y←y-x
    ││└■
    │└până când y=0
    └până când x≠1
     scrie n+1
    Arată răspunsul și explicația
    #include <iostream>
    using namespace std;
    
    int main()
    {
        int m, n, x, y;
        cin >> m >> n;
        do
        {
            x = m; y = n; n = n - 1;
            do
            {
                if (x > y) x = x - y;
                else y = y - x;
            } while (y != 0);
        } while (x == 1);
        cout << n + 1;
        return 0;
    }
    
    repetă…până când y=0 devine do…while (y != 0), iar repetă…până când x≠1 devine do…while (x == 1): în C/C++ se scrie condiția de continuare, adică negata celei de oprire.
  4. Exercițiul 1.d6p

    Algoritmul alăturat este reprezentat în pseudocod.

    Scrieți în pseudocod un algoritm echivalent cu cel dat, înlocuind adecvat a doua structură repetă...până când cu o structură repetitivă cu test inițial.

    citește m,n
      (numere naturale, 1<m<n)
    ┌repetă
    │ x←m; y←n; n←n-1
    │┌repetă
    ││┌dacă x>y atunci x←x-y
    │││altfel y←y-x
    ││└■
    │└până când y=0
    └până când x≠1
     scrie n+1
    Arată răspunsul și explicația
    citește m,n (numere naturale, 1<m<n)
    ┌repetă
    │ x←m; y←n; n←n-1
    │┌cât timp y≠0 execută
    ││┌dacă x>y atunci x←x-y
    │││altfel y←y-x
    ││└■
    │└■
    └până când x≠1
    scrie n+1
    
    repetă…până când execută corpul cel puțin o dată, iar cât timp poate să nu îl execute deloc. Aici nu contează: n nu scade niciodată sub m (pentru n=m cel mai mare divizor comun este m, deci bucla exterioară se oprește), așa că y←n primește mereu o valoare nenulă și corpul s-ar executa oricum. Condiția de continuare este negata celei de oprire: y≠0.
  5. Exercițiul 26p

    Un arbore cu 9 noduri, numerotate de la 1 la 9, are muchiile:

    1. [1,2]
    2. [2,8]
    3. [2,9]
    4. [3,6]
    5. [4,6]
    6. [5,8]
    7. [6,8]
    8. [7,8]

    Scrieți două noduri care pot fi alese drept rădăcină, astfel încât nodul 8 să aibă doi “frați”.

    Arată răspunsul și explicația
    2 6
    
    Nodul 8 are vecinii 2, 5, 6 și 7. Ca 8 să aibă doi frați, tatăl lui trebuie să aibă trei fii, iar tatăl lui 8 este unul dintre vecinii lui.
    Nodul 2 are vecinii 1, 8 și 9, iar nodul 6 are vecinii 3, 4 și 8. Un nod cu trei vecini are trei fii doar când este chiar rădăcina; altfel unul dintre vecini îi este tată. Cu rădăcina 2, fiii lui 2 sunt 1, 8 și 9; cu rădăcina 6, fiii lui 6 sunt 3, 4 și 8. Nodurile 5 și 7 au un singur vecin, deci nu pot fi tatăl lui 8 cu trei fii.
  6. Exercițiul 36p

    Variabilele tI, pN și tL permit accesul la câte un șir de maximum 20 de caractere. Inițial, șirul accesat prin tL este vid, șirul accesat prin tI reprezintă un număr de telefon în format internațional, iar șirul accesat prin pN reprezintă un prefix național sau este un șir vid.

    Numărul de telefon în format internațional conține codul de țară, scris între paranteze rotunde, urmat de cifrele numărului propriu-zis. Codul de țară este format din cifre sau din simbolul + (plus), urmat de cifre. În multe țări, pentru a forma local un număr de telefon, se înlocuiește secvența formată din paranteze și codul de țară cu un prefix național format din cifre (de exemplu 0, în România) sau cu șirul vid (de exemplu în SUA).

    Scrieți o secvență de instrucțiuni C/C++ astfel încât, în urma executării acesteia, șirul accesat prin tL să reprezinte numărul de telefon format local. Declarați corespunzător eventualele alte variabile utilizate.

    Exemplu: dacă prin variabila tI se accesează șirul (+254)722123456, iar prin variabila pN se accesează șirul 0, atunci numărul format local este 0722123456, iar dacă prin variabila tI se accesează șirul (+1)2121234567, iar prin variabila pN se accesează șirul vid, atunci numărul format local este 2121234567.

    Arată răspunsul și explicația
    strcpy(tL, pN);
    strcat(tL, strchr(tI, ')') + 1);
    
    Numărul local este prefixul național urmat de cifrele de după paranteza închisă. strchr(tI, ')') indică paranteza, deci de la poziția următoare începe numărul propriu-zis. În tL se copiază întâi prefixul (chiar dacă e șirul vid), apoi i se adaugă restul numărului.

Subiectul al III-lea30 de puncte

  1. Exercițiul 110p

    Subprogramul Plus are un singur parametru, n, prin care primește un număr natural (n∈[10,109)). Subprogramul înlocuiește în n fiecare secvență 25 cu câte o secvență 26 și furnizează, prin același parametru, numărul obținut. Dacă nu se înlocuiește nicio secvență, subprogramul furnizează numărul nemodificat.

    Scrieți definiția completă a subprogramului C/C++.

    Exemplu: dacă n=202535250, după apel n=202635260.

    Arată răspunsul și explicația
    void Plus(int &n)
    {
        int m = n, r = 0, p = 1, c;
        while (m > 0)
        {
            c = m % 10;
            if (c == 5 && m / 10 % 10 == 2) c = 6;
            r = r + c * p;
            p = p * 10;
            m = m / 10;
        }
        n = r;
    }
    
    Cifrele lui n se iau de la dreapta, cu m%10, și se pun într-un număr nou r, fiecare pe poziția ei (p este puterea lui 10 a poziției). O cifră 5 care are în stânga cifra 2 este finalul unei secvențe 25, deci în locul ei se pune 6.
    Pentru că p crește la fiecare cifră, și zerourile de la finalul lui n rămân la locul lor. Rezultatul se furnizează prin parametrul transmis prin referință, int &n.
  2. Exercițiul 210p

    Terenul alocat unui târg de jucării artizanale a fost împărțit în zone dispuse ca elementele unui tablou bidimensional cu număr egal de linii și coloane. Pentru a putea fi testate de copii, fiecare jucărie are alocată o zonă și este identificată printr-un număr natural. Organizatorii au hotărât eliminarea tuturor jucăriilor plasate pe diagonala secundară a tabloului și rearanjarea celor păstrate, prin deplasarea unora dintre acestea cu câte o poziție spre stânga, astfel încât să nu existe zone intermediare libere, ca în exemplu.

    Scrieți un program C/C++ care citește de la tastatură numere naturale din intervalul [2,102], și anume n și elementele unui tablou bidimensional cu n linii și n coloane, reprezentând numerele de identificare ale jucăriilor, în ordinea plasării lor inițiale pe teren. Programul modifică apoi tabloul în memorie corespunzător hotărârii organizatorilor și afișează pe ecran tabloul obținut, fiecare linie a tabloului pe câte o linie a ecranului, elementele de pe aceeași linie fiind separate prin câte un spațiu.

    Exemplu: pentru n=4 și tabloul

    Figura din enunț
    Arată răspunsul și explicația
    #include <iostream>
    using namespace std;
    
    int main()
    {
        int n, a[100][100], i, j;
        cin >> n;
        for (i = 0; i < n; i++)
            for (j = 0; j < n; j++)
                cin >> a[i][j];
        for (i = 0; i < n; i++)
            for (j = n - 1 - i; j < n - 1; j++)
                a[i][j] = a[i][j + 1];
        for (i = 0; i < n; i++)
        {
            for (j = 0; j < n - 1; j++)
                cout << a[i][j] << ' ';
            cout << '\n';
        }
        return 0;
    }
    
    Pe linia i (numerotând de la 0), elementul de pe diagonala secundară este în coloana n-1-i. Elementele de după el se mută cu o poziție spre stânga, peste el, deci fiecare linie rămâne cu n-1 jucării, fără spații libere între ele. Se afișează primele n-1 elemente de pe fiecare linie.
  3. Exercițiul 3.a2p

    Se citește de la tastatură un număr natural, n (n∈[1,109]), și se cere să se scrie în fișierul text bac.txt cel mai mare număr natural p cu proprietatea că numărul 26p este divizor al numărului obținut prin calcularea produsului 1∙2∙3∙...∙n.

    Proiectați un algoritm eficient din punctul de vedere al timpului de executare și al memoriei utilizate.

    Exemplu: dacă n=28, atunci fișierul conține numărul 2 (262=676 este divizor al lui 1∙2∙3∙..∙28 = 304888344611713860501504000000)

    Descrieți în limbaj natural algoritmul proiectat, justificând eficiența acestuia.

    Arată răspunsul și explicația
    26 = 2·13, iar p este cea mai mare putere pentru care 26^p divide produsul 1·2·…·n. În acest produs factorul 2 apare de mai multe ori decât factorul 13 (fiecare al doilea număr este par, dar doar fiecare al treisprezecelea se împarte la 13), deci p este numărul de apariții ale lui 13 în descompunerea produsului.
    
    Dintre numerele de la 1 la n, [n/13] se împart la 13 și aduc câte un 13; dintre ele, [n/13^2] se împart la 13^2 și mai aduc unul, [n/13^3] încă unul și așa mai departe. Deci p = [n/13] + [n/13^2] + [n/13^3] + …, adunând cât timp puterea lui 13 nu depășește n.
    
    Eficiență: se calculează câte un termen pentru fiecare putere a lui 13 până la n (cel mult 8 pentru n ≤ 10^9), deci numărul de pași este logaritmic, sub cel liniar cerut. Se folosesc doar câteva variabile simple, deci memoria este constantă.
  4. Exercițiul 3.b8p

    Se citește de la tastatură un număr natural, n (n∈[1,109]), și se cere să se scrie în fișierul text bac.txt cel mai mare număr natural p cu proprietatea că numărul 26p este divizor al numărului obținut prin calcularea produsului 1∙2∙3∙...∙n.

    Proiectați un algoritm eficient din punctul de vedere al timpului de executare și al memoriei utilizate.

    Exemplu: dacă n=28, atunci fișierul conține numărul 2 (262=676 este divizor al lui 1∙2∙3∙..∙28 = 304888344611713860501504000000)

    Scrieți programul C/C++ corespunzător algoritmului proiectat.

    Arată răspunsul și explicația
    #include <fstream>
    #include <iostream>
    using namespace std;
    
    int main()
    {
        long long n, p = 0, q = 13;
        cin >> n;
        while (q <= n)
        {
            p = p + n / q;
            q = q * 13;
        }
        ofstream fout("bac.txt");
        fout << p;
        fout.close();
        return 0;
    }
    
    Programul adună termenii de la 3.a. q este long long: la ultimul pas, după ce trece de n, q*13 poate depăși limita tipului int.

Vrei să vezi cât ai lua?

În test ai cronometrul de la examen, codul tău se compilează pe loc, iar la final primești nota.

Rezolv-o cu timpul de la examen