• 2019
  • 2020
  • 2021
  • 2022
  • 2023
  • 2024
  • 2025

2019 - model

Subiectul III, ex 1

-----------------
        

Subiectul III, ex 2

-----------------
        

Subiectul III, ex 3

-----------------
        

2019 - iarnă

Subiectul III, ex 1

-----------------
        

Subiectul III, ex 2

-----------------
        

Subiectul III, ex 3

-----------------
        

2019 - primăvară

Subiectul III, ex 1

-----------------
        

Subiectul III, ex 2

-----------------
        

Subiectul III, ex 3

-----------------
        

2019 - specială

Subiectul III, ex 1

-----------------
        

Subiectul III, ex 2

-----------------
        

Subiectul III, ex 3

-----------------
        

2019 - vară

Subiectul III, ex 1

-----------------
        

Subiectul III, ex 2

-----------------
        

Subiectul III, ex 3

-----------------
        

2019 - toamnă

Subiectul III, ex 1

-----------------
        

Subiectul III, ex 2

-----------------
        

Subiectul III, ex 3

-----------------
        

2020 - model

Subiectul III, ex 1

-----------------
        

Subiectul III, ex 2

-----------------
        

Subiectul III, ex 3

#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("numere.in");

int main()
{
    int n;
    int x, y;
    int c=1;

    fin >> n;
    fin >> x;

    while (fin >> y)
        if (x!=y)
        {
            c++;
            x=y;
        }

    cout << n-c;

    return 0;
}
        

2020 - iarnă

Subiectul III, ex 1

-----------------
        

Subiectul III, ex 2

-----------------
        

Subiectul III, ex 3

#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("cifre.in");

int vf[10];
int i, j;
int retin = -1;
int nr_I;
int c;

int main()
{
    while (fin >> c)
        vf[c]++;

    // caut cazurile cu frecvențe impare
    for(c=0; c<=9; c++)
        if (vf[c]%2==1)
        {
            nr_I++;
            retin = c;
        }

    if (nr_I>1)
        cout << "IMPOSIBIL";
    else
    {
        for(c=9; c>=0; c--)           // afișare "descrescătoare"
            for(j=1; j<=vf[c]/2; j++)
                cout << c;

        if (retin!=-1)                // cifra din mijloc, dacă este cazul
            cout << retin;

        for(c=0; c<=9; c++)           // afișare "crescătoare"
            for(j=1; j<=vf[c]/2; j++)
                cout << c;

    }
    return 0;
}
        

2020 - primăvară

Subiectul III, ex 1

-----------------
        

Subiectul III, ex 2

-----------------
        

Subiectul III, ex 3

-----------------
        

2020 - specială

Subiectul III, ex 1

-----------------
        

Subiectul III, ex 2

-----------------
        

Subiectul III, ex 3

-----------------
        

2020 - vară

Subiectul III, ex 1

-----------------
        

Subiectul III, ex 2

-----------------
        

Subiectul III, ex 3

#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("bac.in");

int n, v[1001], i;
int g;

int main()
{
    while (fin>>n)
        v[n]++;

    for(i=1; i<=1000; i++)
        if (v[i]%2!=0)
            g++;

    if (g==0 || g==1)
        cout << "DA";
    else
        cout << "NU";

    return 0;
}

/* Exemplu:
bac.in conține 100 30 100 30 500 30 30
se afișează DA
*/
        

2020 - toamnă

Subiectul III, ex 1

-----------------
        

Subiectul III, ex 2

-----------------
        

Subiectul III, ex 3

-----------------
        

2021 - model

Subiectul III, ex 1

-----------------
        

Subiectul III, ex 2

#include <iostream>

using namespace std;

int main()
{
    int i, m; // pentru linii
    int j, n; // pentru coloane

    int M[101][101]; // tabloul bidimensional
    int nr=0; // generez pătrate perfecte pare

    cin >> m >> n;

    // generare din colțul dreapta jos
    for(i=m-1; i>=0; i--)
        for(j=n-1; j>=0; j--)
        {
            M[i][j] = nr*nr;
            nr = nr+2;
        }

    for(i=0; i<m; i++)
    {
        for(j=0; j<n; j++)
            cout << M[i][j] <<' ';
        cout << '\n';
    }
    return 0;
}
        

Subiectul III, ex 3

#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("cheltuieli.in");

int ch[101];

int tip;  // tipul produsului cumpărat
int nrP;  // numărul de produse de acest tip cumpărate
int pret; // prețul unui astfel de produs la acel moment

int pretMAX; // cea mai mare sumă cheltuită pentru toate produsele de același tip
int cate;    // numărul de tipuri de produse pentru care s-a obținut această sumă

int main()
{
    while (fin >> tip >> nrP >> pret)
        ch[tip] = ch[tip] + nrP*pret;

    // aflu prețul maxim dintre toate tipurile, respectiv de câte ori apare
    for(tip=1; tip<=100; tip++)
    {
        if (pretMAX < ch[tip])
        {
            pretMAX = ch[tip];
            cate = 0;
        }

        if (pretMAX == ch[tip])
            cate++;
    }

    cout << pretMAX << ' ' << cate;

    return 0;
}
        

2021 - iarnă

Subiectul III, ex 1

-----------------
        

Subiectul III, ex 2

-----------------
        

Subiectul III, ex 3

-----------------
        

2021 - primăvară

Subiectul III, ex 1

-----------------
        

Subiectul III, ex 2

-----------------
        

Subiectul III, ex 3

-----------------
        

2021 - specială

Subiectul III, ex 1

-----------------
        

Subiectul III, ex 2

#include <iostream>

using namespace std;

int main()
{
    int n, k;
    int a[20][20];
    int i, j;
    int t;

    cin >> n >> k;
    for(i=0; i < n; ++i)
        for(j=0; j < n; ++j)
            cin >> a[i][j];

    for(i=0; i < k; ++i) // interschimbare
    {
        t = a[i][k-1];
        a[i][k-1] = a[k-1][i];
        a[k-1][i] = t;
    }

    for(i=0; i < n; ++i, cout << '\n')
        for(j=0; j < n; ++j)
            cout << a[i][j] << " ";

    return 0;
}

/* Exemplu pentru n=5, k=4 și tabloul

2 4 3 5 6
8 0 9 8 7
2 6 9 0 5
6 1 3 6 9
7 3 9 4 2

se obține

2 4 3 6 6 
8 0 9 1 7 
2 6 9 3 5 
5 8 0 6 9 
7 3 9 4 2

*/
        

Subiectul III, ex 3

#include <iostream>
#include <fstream>

using namespace std;

int x, y, n;

ofstream fout("bac.out");

int main()
{
    cin >> x >> y;

    while (y!=1)
    {
        n = (y-x)/2;      // valoarea lui n, corespunzătoare termenului y=f(n)
        fout << y << " "; // se afișează termenul y=f(n)

        y = x;            // se generează termenii șirului mai mici decât y
        x = y - 2*(n-1);
    }

    fout << 1; // termenul f(0)

    return 0;
}

/* Exemplu:
dacă x=21 și y=31,
fişierul conţine valorile
31 21 13 7 3 1


 y  x  n
31 21  5,   y=f(5)
21 13  4,   y=f(4)
13  7  3,   y=f(3)
 7  3  2,   y=f(2)
 3  1  1,   y=f(1)
 1  1   ,   y=f(0)
*/
        

2021 - vară

Subiectul III, ex 1

-----------------
        

Subiectul III, ex 2

-----------------
        

Subiectul III, ex 3

-----------------
        

2021 - toamnă

Subiectul III, ex 1

-----------------
        

Subiectul III, ex 2

-----------------
        

Subiectul III, ex 3

-----------------
        

2022 - model

Subiectul III, ex 1

-----------------
        

Subiectul III, ex 2

-----------------
        

Subiectul III, ex 3

#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("bac.txt");

int x;
int pr[9], ul[9]; // secvență par-încadrată
int l, lmax; // calcul lungime maximă
int i;

int main()
{
    while (fin >> x)
    {
        i++;

        if ( x%2 == 0 )
        {
            if ( !pr[x] )
                pr[x] = i;
            else
                ul[x] = i;
        }
    }

    for(i=0; i<=8; i=i+2)
    {
        l = ul[i] - pr[i] + 1;

        if (lmax < l)
            lmax=l;
    }

    cout << lmax << '\n';

    for(i=0; i<=8; i=i+2)
        if ( ul[i] - pr[i] + 1 == lmax )
            cout << i << ' ';

    return 0;
}
        

2022 - iarnă

Subiectul III, ex 1

-----------------
        

Subiectul III, ex 2

#include <iostream>
#include <cstring>

using namespace std;

int main()
{
    char t[101], *p;
    char c[11];

    char stg[11]; // cuvântul din stânga cuvântului citit
    char mij[11]; // cuvântul curent, din mijloc
    char drp[11]; // cuvântul din dreapta cuvântului citit

    int g=0;

    cin >> c;
    cin.get();
    cin.getline(t,101);

    p = strtok(t," ");
    strcpy(stg, p);

    p = strtok(NULL," ");
    strcpy(mij, p);

    p = strtok(NULL," ");

    while (p)
    {
        strcpy(drp, p);

        if (strcmp(c, mij)==0)
        {
            cout << stg << ' ' << drp << endl;
            g=1;
        }

        strcpy(stg,mij);
        strcpy(mij,drp);

        p = strtok(NULL," ");
    }
    if (g==0)
        cout << "nu exista";

    return 0;
}

/* Exemple

Pentru cuvântul bac și textul de mai jos:
el a fost la bac si apoi a plecat cu un bac la mare

se afișează:
   la si
   un la


Pentru cuvântul bac și textul de mai jos:
el a fost la bac

se afișează:
   nu exista

*/
        

Subiectul III, ex 3

#include <iostream>
#include <fstream>

using namespace std;

ifstream fin ("bac.in");

int n;

int flc; // fluctuația din două zile consecutive
int f_max=0; // fluctuația cea mai mare
int f_min=999999999; // fluctuația cea mai mică

int Vmin1, Vmin2;
int Vmax1, Vmax2;

int x, y; // valoarea din ziua curentă, respectiv ziua anterioară

int i;

int main()
{
    fin >> n;
    fin >> y;
    for(i=2; i<=n; i++)
    {
        fin >> x;

        flc = (x>y)?(x-y):(y-x);

        if (flc<=f_min)
        {
            f_min=flc;
            Vmin1=y;
            Vmin2=x;
        }
        if (flc>=f_max)
        {
            f_max=flc;
            Vmax1=y;
            Vmax2=x;
        }
        y = x;
    }

    cout << f_max << ' ' << f_min << '\n';
    cout << Vmax1 << ' ' << Vmax2 << '\n';
    cout << Vmin1 << ' ' << Vmin2;

    return 0;
}
        

2022 - primăvară

Subiectul III, ex 1

-----------------
        

Subiectul III, ex 2

-----------------
        

Subiectul III, ex 3

#include <iostream>
#include <fstream>

using namespace std;

ofstream fout("bac.txt");

int main()
{
    // 45 = 3 * 3 * 5

    int n;
    int nr3 = 0;
    int nr5 = 0;

    cin >> n;

    // numărul de apariții ale lui 3 în descompunerea în factori primi a lui n!
    for(int i = 3; i <= n; i+=3)
    {
        int k = i;
        while (k % 3 == 0)
        {
            nr3++;
            k/=3;
        }
    }

    // numărul de apariții ale lui 5 în descompunerea în factori primi a lui n!
    for(int i = 5; i <= n; i+=5)
    {
        int k = i;
        while (k % 5 == 0)
        {
            nr5++;
            k/=5;
        }
    }

    nr3 /= 2;

    if (nr3 <= nr5)
        fout << nr3;
    else
        fout << nr5;

    return 0;
}
        

2022 - specială

Subiectul III, ex 1

-----------------
        

Subiectul III, ex 2

-----------------
        

Subiectul III, ex 3

-----------------
        

2022 - vară

Subiectul III, ex 1

-----------------
        

Subiectul III, ex 2

#include <iostream>

using namespace std;

int m, n; // nivelurile parcelelor
int i, j;
int plaja[102][102];
int VecinMic;
int t; // cantitatea totală de nisip adăugată

int main()
{
    cin >> m >> n;
    for(i=1; i<=m; i++)
        for(j=1; j<=n; j++)
            cin >> plaja[i][j];

    // "bordarea" plajei
    for(j=0; j<=n+1; j++)
        plaja[0][j]=10, plaja[m+1][j]=10;
    for(i=0; i<=m+1; i++)
        plaja[i][0]=10, plaja[i][n+1]=10;


    for(i=1; i<=m; i++)
    {
        for(j=1; j<=n; j++)
        {
            // pentru parcela [i][j], caut cel mai mic vecin

            VecinMic = plaja[0][0]; // 10

            if (plaja[i-1][j] < VecinMic) // sus
                VecinMic = plaja[i-1][j];
            if (plaja[i+1][j] < VecinMic) // jos
                VecinMic = plaja[i+1][j];

            if (plaja[i][j-1] < VecinMic) // stânga
                VecinMic = plaja[i][j-1];
            if (plaja[i][j+1] < VecinMic) // dreapta
                VecinMic = plaja[i][j+1];

            // înnisipare
            if (plaja[i][j] < VecinMic)
                t += VecinMic-plaja[i][j];
        }
    }

    cout << t;

    return 0;
}
        

Subiectul III, ex 3

-----------------
        

2022 - toamnă

Subiectul III, ex 1

-----------------
        

Subiectul III, ex 2

-----------------
        

Subiectul III, ex 3

-----------------
        

2023 - model

Subiectul III, ex 1

int DoiTrei(int n)
{
    do
    {
        if (n%10!=2 && n%10!=3)
            return 0;
        n/=10;
    }
    while(n);

    return 1;
}
        

Subiectul III, ex 2

#include <iostream>

using namespace std;

int a[102][102], i, j, n, g;

int main()
{
    cin >> n;

    /* 0 - topogan, 1 - leagăn, 2 - balansoar, 3 - carusel */
    for(i=1; i<=n; i++)
        for(j=1; j<=n; j++)
            cin >> a[i][j];

    // bordarea suprafeței locului de joacă cu „spațiu verde”, 4
    for(i=0; i<=n+1; i++)
        a[i][0] = a[i][n+1] = 4;
    for(j=0; j<=n+1; j++)
        a[0][j] = a[n+1][j] = 4;

    for(i=1; i<=n; i++)
        for(j=1; j<=n; j++)
            if (a[i][j]==3) // carusel
                if (a[i+1][j]!=0 && a[i-1][j]!=0 && a[i][j+1]!=0 && a[i][j-1]!=0) // niciun topogan împrejur
                {
                    g = 1;
                    cout << i << ' ';
                }

    if (!g)
        cout << "nu exista";

    return 0;
}
        

Subiectul III, ex 3

#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("bac.txt");

int n, x, y, i;

int xMinP = 1000002; // cel mai mic număr par
int xMinI = 1000001; // cel mai mic număr impar

int yMaxP = -2; // cel mai mare număr par
int yMaxI = -1; // cel mai mare număr impar

int main()
{
    fin >> n;

    //  orice x, dintre primii n termeni ai șirului
    for(i=1; i<=n; i++)
    {
        fin >> x;
        if (x%2==0 && x<xMinP) xMinP=x;
        if (x%2==1 && x<xMinI) xMinI=x;
    }

    // orice y, dintre ultimii n termeni ai șirului
    for(i=1; i<=n; i++)
    {
        fin >> y;
        if (y%2==0 && y>yMaxP) yMaxP=y;
        if (y%2==1 && y>yMaxI) yMaxI=y;
    }


    if (xMinP > yMaxI && xMinI > yMaxP)
        cout << "DA";
    else
        cout << "NU";

    return 0;
}
        

2023 - iarnă

Subiectul III, ex 1

void ecran(int n) // steluțe
{
    char s[7], l[16]="";
    int jm, ps;

    // transform numărul n în șir de caractere
    itoa(n, s, 10);

    // construiesc primul rând
    strcat(l, s);
    strcat(l, "*");
    strcat(l, s);

    // steluța de la jumătate
    jm = strlen(l)/2;

    // pasul (sau rândul)
    ps = 1;

    while (l[0]!='*')
    {
        cout << l << endl;

        // plasez steluțe
        l[jm-ps] = '*';
        l[jm+ps] = '*';

        // trec la următorul pas/rând
        ps++;
    }

    // rândul doar cu steluțe
    cout << l;
}
        

Subiectul III, ex 2

-----------------
        

Subiectul III, ex 3

#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("bac.in");

int x; // 1 <= x <= 50
int k; // 1 <= k <= 100000

int t1, t2, t3; // numărul de cifre pentru trei termeni succesivi

char cifra;

int main()
{
    fin >> x >> k;
    fin.get();

    if (x<=8)
    {
        t1=1;
        t2=1;
    }
    else
        if (x==9)
        {
            t1=1;
            t2=2;
        }
        else
            if (x>9)
            {
                t1=2;
                t2=2;
            }

    while (t2!=k)
    {
        t3 = t1 + t2;
        t1=t2;
        t2=t3;
    }

    // t1 va avea numărul de cifre a termenului anterior
    do
    {
        fin >> cifra;
        cout << cifra;
        t1--;
    }
    while (t1);

    return 0;
}

/*
Indiciu:
există 3 cazuri in funcție de valoarea de plecare a lui x:

Cazul 1, x<=8, vom avea șirul 1,1,2,3,5,8,13, etc.
Cazul 2, x=9,  vom avea șirul 1,2,3,5,8,13,21, etc.
Cazul 3, x>=10,vom avea șirul 2,2,4,6,10,16,26, etc.

Exemplu: dacă fișierul conține valorile de mai jos
5 8
65665656

se va afișa pe ecran numărul 65665
*/
        

2023 - primăvară

Subiectul III, ex 1

-----------------
        

Subiectul III, ex 2

#include <iostream>
#include <cstring>

using namespace std;

char s[101]; // denumirea științifică a unei păsări
char t[101]; // denumirea științifică ce păstrează doar primele trei litere

char *p; // formarea entităților

int main()
{
    cin.getline(s,101);

    p = strtok(s," ");
    while (p)
    {
        if (p[strlen(p)-1]=='.')
        {
            if (p[0]=='F')
                strcat(t,"fam.");

            if (p[0]=='G')
                strcat(t,"gen.");

            if (p[0]=='S')
                strcat(t,"spe.");
        }
        else
            strcat(t,p);

        strcat(t," ");

        p=strtok(NULL, " ");
    }

    cout << t;

    return 0;
}
        

Subiectul III, ex 3

#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("bac.txt");

int main ()
{
    int tC = -1; // temperatura curentă
    int tM = -1; // temperatura cea mai mare
    int tA = -1; // temperatura anterioară
    int pasR= 0; // pasul reprezentativ

    while (fin >> tC)
    {
        pasR++;

        if ( tM <= tC )
            if ( tA != tC )
            {
                tM = tC;
                cout << pasR << ' ';
            }

        tA = tC;
    }
    return 0;
}
        

2023 - specială

Subiectul III, ex 1

-----------------
        

Subiectul III, ex 2

-----------------
        

Subiectul III, ex 3

-----------------
        

2023 - vară

Subiectul III, ex 1

-----------------
        

Subiectul III, ex 2

-----------------
        

Subiectul III, ex 3

#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("bac.txt");

int x, i;

int Vprf[100]; // vector de frecvență ce memorează numărul de apariții ale prefixului
int Vsuf[100]; // vector de frecvență ce memorează numărul de apariții ale sufixului

int nrV; // numărul valorilor de două cifre

int main()
{
    while (fin >> x)
    {
        if (100<=x && x<=999) // x are 3 cifre
        {
            Vprf[x/10]++;
            Vsuf[x%100]++;
        }

        if (1000<=x && x<=9999) // x are 4 cifre
        {
            Vprf[x/100]++;
            Vsuf[x%100]++;
        }
    }

    for(i=10; i<=99; i++)
        if ( Vprf[i]==Vsuf[i] && Vprf[i]!=0 )
            nrV++;

    cout << nrV;

    return 0;
}

        

2023 - toamnă

Subiectul III, ex 1

-----------------
        

Subiectul III, ex 2

#include <iostream>

using namespace std;

int a[20][20];
int m, n, i, j;
int Sp; // suma într-un pătrat de valoare p

int Smax = -1;

int main()
{
    cin >> m >> n;

    for(i=0; i<m; i++)
        for(j=0; j<n; j++)
            cin >> a[i][j];

    for(i=1; i<m; i++)
        for(j=1; j<n; j++)
        {
            Sp = a[i-1][j-1] + a[i-1][j] + a[i][j-1] + a[i][j];
            if (Smax < Sp)
                Smax = Sp;
        }

    cout << Smax;

    return 0;
}
        

Subiectul III, ex 3

-----------------
        

2024 - model

Subiectul III, ex 1

-----------------
        

Subiectul III, ex 2

#include <iostream>
#include <cstring>

using namespace std;

int n;
int g_mic, g_mare; // găsit

char s[101];
char mic[101], mare[101];

char *p;

int main()
{
    cin>>n;
    cin.get();

    cin.getline(s, 101);

    p = strtok(s, " ");
    while (p)
    {
        if ( strlen(p) < n )  // mai puțin de n litere
        {
            strcat(mic, p);
            strcat(mic," ");
            g_mic=1;
        }

        if ( strlen(p) > n ) // mai mult de n litere
        {
            strcat(mare, p);
            strcat(mare," ");
            g_mare=1;
        }

        p=strtok(NULL, " ");
    }

    // prima linie să conțină mulțimea cuvintelor care au mai puțin de n litere,
    // iar a doua linie să conțină mulțimea cuvintelor care au mai mult de n litere.

    if (g_mic && g_mare)
        cout << mic << endl << mare;
    else
        cout << "nu exista";

    // dacă una dintre cele două mulțimi este vidă,
    // se afișează pe ecran doar mesajul nu exista.

    return 0;
}
        

Subiectul III, ex 3

#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("bac.txt");

int n1, n2, n3; // concurenţii care primesc premiile I, II, III
int p1, p2, p3; // preţurile cărţilor alese
int x, v[1001], k;

int main()
{
    fin >> n1 >> n2 >> n3;

    while (fin >> x)
        v[x]++;

    for(k=1000; k>=10; k--) // intervalul 10..1000
        if (v[k] >= n1)
        {
            p1 = k;
            break;
        }

    for(k=p1-1; k>=10; k--)
        if (v[k] >= n2)
        {
            p2 = k;
            break;
        }

    for(k=p2-1; k>=10; k--)
        if (v[k] >= n3)
        {
            p3 = k;
            break;
        }

    if (p1 && p2 && p3)
        cout << p1 << ' ' << p2 << ' ' << p3;
    else
        cout << "nu exista";

    return 0;
}
        

2024 - iarnă

Subiectul III, ex 1

-----------------
        

Subiectul III, ex 2

#include <iostream>
#include <cstring>

using namespace std;

int palindrom(char s[])
{
    int lung = strlen(s);
    int i;

    for(i = 0; i <= lung / 2; i++)
        if (s[i] != s[lung - i - 1])
            return  0;

    return 1;
}

int voc(char s[])
{
    int lung = strlen(s);
    int vocale = 0;
    int i;

    for(i = 0; i < lung; i++)
        if (strchr("aeiou", s[i]))
            vocale++;

    return vocale;
}

int main()
{
    char sir[256], pal[128][256], *p, t[256];
    int n = 0;
    int i, j;

    cin.getline(sir, 256);

    p = strtok(sir, " ,");
    while (p)
    {
        // formez un vector de „cuvinte de tip palindrom”
        if (palindrom(p))
        {
            strcpy(pal[n], p);
            n++;
        }
        p = strtok(NULL, " ,");
    }

    for(i = 0; i< n-1; i++)
        for(j = i + 1; j < n; j++)

            // ordine descrescătoare după numărul de vocale
            if (voc(pal[i]) > voc(pal[j]))
            {
                strcpy(t, pal[i]);
                strcpy(pal[i], pal[j]);
                strcpy(pal[j],t);
            }
            else if(voc(pal[i]) == voc(pal[j]))

                // ordonare lexicografică
                if (strcmp(pal[i], pal[j]) < 0)
                {
                    strcpy(t, pal[i]);
                    strcpy(pal[i], pal[j]);
                    strcpy(pal[j], t);
                }

    for(i = n - 1; i >= 0; i--)
        cout << pal[i] << endl;

    return 0;
}
        

Subiectul III, ex 3

#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("bac.txt");

int vf[10];
int n, c, i, NrPerechi;

int main ()
{
    while (fin>>n)
    {
        // cifra de control
        if(n%9==0)
            c=9;
        else
            c=n%9;

        // vector de frecvență
        vf[c]++;
    }

    // calcul număr perechi (indiciu: suma Gauss)
    for(i=1; i<=9; i++)
        NrPerechi = NrPerechi + vf[i]*(vf[i]-1)/2;

    cout << NrPerechi;

    return 0;
}
        

2024 - primăvară

Subiectul III, ex 1

int Impare(int n)
{
    int x=0; // numărul obținut prin duplicarea fiecărei cifre impare
    int g=0; // găsit
    int p=1;

    while (n)
    {
        if (n%10%2==1) // cifră impară
        {
            x = x+(n%10)*p;
            p = p*10;

            x = x+(n%10)*p;
            p = p*10;

            g = 1;
        }
        else
        {
            x = x+(n%10)*p;
            p = p*10;
        }

        n=n/10;
    }
    if (g)
        return x;
    else
        return -1;
}
        

Subiectul III, ex 2

#include <iostream>
#include <cstring>

using namespace std;

int n, i, ok;

char listaC[50][11]; // lista de cuvinte
char s[101]; // șablon
char t[101]; // fraza generată pe baza șablonului
char *p;

int main()
{
    cin >> n;
    cin.get();

    // citesc lista de cuvinte
    for(i=1; i<=n; i++)
    {
        cin >> listaC[i];
        cin.get();
    }

    // citesc șablonul
    cin.getline(s,101);

    p = strtok(s, " ");
    while (p)
    {
        if (p[0]=='*')  // găsesc un cuvânt generic
        {
            ok = 0;

            for(i=1; i<=n; i++)
                if ( strlen(p) == strlen(listaC[i]) )   // completez cu un cuvânt din lista de cuvinte
                {
                    strcat(t, listaC[i]);
                    strcat(t, " ");
                    ok = 1;
                    break;
                }

            if (ok==0) // completez cu cuvântul generic
            {
                strcat(t, p);
                strcat(t, " ");
            }
        }
        else    // completez cu un cuvânt din șablon
        {
            strcat(t, p);
            strcat(t, " ");
        }

        p = strtok(NULL, " ");
    }

    if ( strchr(t,'*') )
        cout << "imposibil";
    else
        cout << t;

    return 0;
}
        

Subiectul III, ex 3

#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("bac.in");

int main()
{
    int vf[1001]={0}; // vector de frecvență pentru [1,1000]
    int x; // parcurgem numerele din fișier
    int api=1;
    int i;

    while (fin >> x)
        vf[x]++;

    for(i = 1; i <= 1000 && api; i++)
    {
        if (vf[i]!=0) // dacă există o valoare i care a apărut în șir

            // numărul de apariții ale fiecărui termen este mai mic sau egal cu acel termen
            // și are o paritate egală cu a acestuia
            if ( vf[i]>i || vf[i]%2 != i%2)
                api = 0;
    }

    if (api)
        cout << "DA";
    else
        cout << "NU";

    return 0;
}
        

2024 - specială

Subiectul III, ex 1

-----------------
        

Subiectul III, ex 2

#include <iostream>

using namespace std;

int main()
{
    int m, n, i, j;
    int a[51][51];

    cin >> m >> n;

    for(i=1; i<=m; i++)
        for(j=1; j<=n; j++)
        {
            // fiecare element este egal cu cea mai mică valoare generată de
            // numerele de ordine ale liniei (i), respectiv coloanei (j) pe care se află.

            if ( i <= 9 && j <= 9 ) // i are o cifră, j are o cifră
            {
                if (i < j)
                    a[i][j]=10*i+j;
                else
                    a[i][j]=10*j+i;
            }

            if ( i > 9 && j > 9 ) // i are două cifre, j are două cifre
            {
                if (i < j)
                    a[i][j]=100*i+j;
                else
                    a[i][j]=100*j+i;
            }

            if ( i < 10 && j > 9 ) // i are o cifră, j are două cifre
            {
                if ( i <= j/10 )
                    a[i][j]=100*i+j;
                else
                    a[i][j]=10*j+i;
            }

            if ( i > 9 && j < 10 ) // i are două cifre, j are o cifră
            {
                if ( i/10 <= j )
                    a[i][j]=10*i+j;
                else
                    a[i][j]=100*j+i;
            }
        }

    for(i=1; i<=m; i++, cout << '\n')
        for(j=1; j<=n; j++)
            cout << a[i][j] << ' ';

    return 0;
}
        

Subiectul III, ex 3

#include <fstream>
#include <iostream>

using namespace std;

ifstream fin("numere.in");

int x; // din intervalul [0,99]

int p=-1; // primul număr
int u=-1; // al doilea număr

int cmax; // cifra maximă

int main()
{
    while (fin >> x) // citirea datelor din fișier
    {
        if (x%10>=cmax) // cifra unităților
        {
            if (cmax == x%10)
                u=x;
            else
                p=x, u=-1;

            cmax = x%10;
        }

        if (x/10>=cmax) // cifra zecilor
        {
            if (cmax == x/10)
                u=x;
            else
                p=x, u=-1;

            cmax = x/10;
        }
    }

    if (u!=-1)
        cout << p << ' ' << u;
    else
        cout << "nu exista";

    return 0;
}

/* Exemple:

numere.in 34 5 38 30 87 70 11 8 82 25 se afişează pe ecran 38 82
numere.in 34 5 38 30 87 70 11 8 38 25 se afişează pe ecran 38 38
numere.in 34 5 38 30 se afişează pe ecran nu exista

*/
        

2024 - vară

Subiectul III, ex 1

int majImp(int a, int b)
{
    int i; // parcurgerea intervalului [a,b]
    int d; // divizor propriu

    int sp; // suma divizorilor proprii pari
    int si; // suma divizorilor proprii impari

    for(i=a; i<=b; i++)
    {
        sp=0, si=0;

        for(d=2; d<=i/2; d++)
            if (i%d==0)
            {
                if (d%2==0)
                    sp+=d;
                else
                    si+=d;
            }

        if (si>sp)
            return i;
    }
    return 0;
}
        

Subiectul III, ex 2

#include <iostream>
#include <cstring>

using namespace std;

char s[101], *p;
int n, ok=1;

int main()
{
    cin.getline(s,101);

    p=strtok(s, " ");
    n=strlen(p);

    while (p && ok)
    {
        if (strlen(p)!=n)
            ok=0;
        p=strtok(NULL, " ");
    }

    if (ok)
        cout << "DA " << n;
    else
        cout << "NU";

    return 0;
}
        

Subiectul III, ex 3

#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("bac.txt");

int x, y; // cotele marcajelor turistice [10,10000]

int lgC=1; // lungimea curentă
int lgM=1; // lungimea maximă

int u; // ultimul marcaj din scară

int main()
{
    fin >> x;
    lgC = 1;

    while (fin >> y)
    {
        if ( x==y-1 ) // cote numere consecutive, ordonate strict crescător
        {
            lgC++;
        }
        else
        {
            if ( lgC>lgM )
            {
                lgM = lgC;
                u = x;
            }
            lgC = 1;
        }
        x = y;
    }

    if ( lgC>lgM )
    {
        lgM = lgC;
        u = x;
    }

    if (u==0)
        cout << "nu exista";
    else
        while (lgM)
        {
            cout << u-lgM+1 << ' ';
            lgM--;
        }

    return 0;
}

/* Exemple

bac.txt 500 600 601 405 569 570 700 701 625 626 627 520
se afișează 625 626 627

bac.txt 500 600 601 405 569 570 700 701 625 6260 627 520 521 522 523 524 525
se afișează 520 521 522 523 524 525

bac.txt 520 521 522 523 524 525 500 600 601 405 569 570 700 701 625 626 627 87665
se afișează 520 521 522 523 524 525

bac.txt 500 600 606 405 569 57 707 7099 625 628 520
se afișează nu exista

*/
        

2024 - toamnă

Subiectul III, ex 1

moderat, Varianta I

int prim(int x)
{
    int d;

    if (x<2)
        return 0;
    for(d=2; d*d <= x; d++)
        if (x%d == 0)
            return 0;

    return 1;
}

int moderat(int n)
{
    int nrP;
    int p1; // primul număr prim
    int p2; // al doilea număr prim

    p1 = 2;
    for(nrP=3; nrP<=n/2; nrP++)
        if (prim(nrP))
        {
            p2 = nrP;
            if ( n == p1 * p2 )
                return 1;
            p1 = p2;
        }

    return 0;
}



moderat, Varianta II

int moderat(int n)
{
    //folosim un vector care să rețină numerele prime necesare
    //cum n<=10^5, avem nevoie de cel mult al 65-lea și al 66-lea număr prim (313*317=99221)
    int v[66];
    int nrP, i, j=0, d, nrdiv;

    for(nrP=2; nrP<=317; nrP++)
    {
        nrdiv = 2; // orice număr prim are exact doi divizori
        for(d=2; d*d<=nrP && nrdiv==2; d++) // căutăm posibili divizori
            if (nrP%d==0)
                nrdiv++;

        if ( nrdiv == 2 ) // nrP este prim, deci îl reținem în vector
            v[j++]=nrP;
    }

    for(i=0; i<j; i++)
        // verificăm dacă n poate fi scris ca produs de două numere prime consecutive
        if ( v[i]*v[i+1] == n )
            return 1;

    return 0;
}
        

Subiectul III, ex 2

#include <iostream>

using namespace std;

int g[101][101]; // grădina
int i, m;
int j, n;

int Fmic; // floarea cea mai mică de pe rând

int main()
{
    cin >> m >> n;
    for(i=0; i < m; i++)
        for(j=0; j < n; j++)
            cin >> g[i][j];

    for(i=1; i < m; i+=2) // rândul de flori
    {
        Fmic = 11;
        for(j=0; j < n; j++)
            if (g[i][j] < Fmic)
                Fmic = g[i][j];

        for(j=0; j < n; j++)
            if (g[i-1][j] >= Fmic) // tunderea gazonului
                g[i-1][j] = Fmic-1;
    }

    for(i=0; i < m; i++, cout << '\n')
        for(j=0; j < n; j++)
            cout << g[i][j] << ' ';

    return 0;
}
        

Subiectul III, ex 3

#include <iostream>
#include <fstream>

using namespace std;

ofstream fout("bac.txt");
// vom afişa şirul obţinut în fişierul bac.txt

int main()
{
    int x, y, z;    // numerele iniţiale
    int u;          // următorul număr generat

    cin >> x >> y >> z;

    fout << z << " " << y << " " << x << " ";
    // afişăm z, y şi x în fişier în ordinea specificată

    do
    {
        u = (4*y-3*x-z)/2;  // calculăm următorul element al şirului
        fout << u << " ";   // îl scriem în fişier

        // actualizăm valorile pentru a genera următorul termen
        z=y;
        y=x;
        x=u;

    }
    while (y!=0); // continuăm până la al doilea 0

    return 0;
}
        

2025 - model

Subiectul III, ex 1

void pao(int x, int y, int &rez)
{
    int xn=0; // x nou, doar cu cifre pare nenule
    int yn=0; // y nou, doar cu cifre pare nenule, oglindit
    int p;

    rez=0;

    p=1;
    while (x)
    {
        if (x%10%2==0 && x%10!=0)
        {
            xn = x%10*p + xn;
            p *= 10;
        }
        x=x/10;
    }

    while (y)
    {
        if (y%10%2==0 && y%10!=0)
            yn = yn*10 + y%10;

        y=y/10;
    }

    if (xn==yn && xn!=0 && yn!=0)
        rez=1;
}
        

Subiectul III, ex 2

#include <iostream>

using namespace std;

int n, k, tb[100][100], i, j;

int main()
{
    cin >> k >> n;

    for(i=0; i<n; i++)
        tb[i][i] = k*(i+1);

    for(i=0; i<n; i++)
        for(j=0; j<n; j++)
            tb[i][j] = tb[i][i]-(j-i);

    for(i=0; i<n; i++, cout << '\n')
        for(j=0; j<n; j++)
            cout << tb[i][j] << ' ';

    return 0;
}
        

Subiectul III, ex 3

-----------------
        

2025 - iarnă

Subiectul III, ex 1

-----------------
        

Subiectul III, ex 2

-----------------
        

Subiectul III, ex 3

-----------------
        

2025 - primăvară

Subiectul III, ex 1

-----------------
        

Subiectul III, ex 2

-----------------
        

Subiectul III, ex 3

-----------------
        

2025 - specială

Subiectul III, ex 1

-----------------
        

Subiectul III, ex 2

-----------------
        

Subiectul III, ex 3

-----------------
        

2025 - vară

Subiectul III, ex 1

-----------------
        

Subiectul III, ex 2

-----------------
        

Subiectul III, ex 3

-----------------
        

2025 - toamnă

Subiectul III, ex 1

-----------------
        

Subiectul III, ex 2

-----------------
        

Subiectul III, ex 3

-----------------