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

2019 - model

Subiectul III, ex 1

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

Subiectul III, ex 2

// Metoda 1

#include <iostream>
#include <cstring>

using namespace std;

char t[101];    // textul inițial
char s[4];      // șirul de obținut

int i;

int gc; // găsit consoana
int gv; // găsit vocala

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

    // găsirea primei consoane din primul cuvânt
    gc=0;
    while (t[i]!=' ')
    {
        if ( (t[i]!='a' && t[i]!='e' && t[i]!='i' && t[i]!='o' && t[i]!='u') && (gc==0) )
        {
            s[0]=t[i];
            gc=1;
        }
        i=i+1;
    }

    i++;    // sărim peste spațiu

    // găsirea primei vocale din al doilea cuvânt
    gv=0;
    while (t[i]!=' ')
    {
        if ( (t[i]=='a' || t[i]=='e' || t[i]=='i' || t[i]=='o' || t[i]=='u') && gv==0 )
        {
            s[1]=t[i];
            gv=1;
        }
        i=i+1;
    }

    if (gc==1 && gv==1)
    {
        s[2]=t[strlen(t)-1];
        s[3]='\0';

        cout << s;
    }
    else
        cout << "nu exista";

    return 0;
}

// Metoda 2

#include <iostream>
#include <cstring>

using namespace std;

char text[101];     // textul inițial
char s[4];          // șirul de obținut
char *p;

int i;

int gc; // găsirea unei consoane
int gv; // gșsirea unei vocale

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

    s[2]=text[strlen(text)-1];  // ultima literă a ultimului cuvânt
    s[3]='\0';

    // extragerea primului cuvânt și găsirea consoanei
    p=strtok(text, " ");
    for(i=0; i<strlen(p); i++)
        if ( ! strchr("aeiou", p[i]))
        {
            gc = 1;         // am găsit consoana
            s[0] = p[i];    // salvez prima consoană a primului cuvânt
            break;
        }

    // extragerea celui de al doilea cuvânt și găsirea vocalei
    p=strtok(NULL, " ");
    for(i=0; i<strlen(p); i++)
        if (strchr("aeiou", p[i]))
        {
            gv = 1;         // am găsit vocala
            s[1] = p[i];    // salvez prima vocală a celui de al doilea cuvânt
            break;
        }

    if (gc && gv)   // daca avem consoana și vocala gasite
        cout << s;  // afișez șirul obținut
    else
        cout << "nu exista";

    return 0;
}
        

Subiectul III, ex 3

#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("bac.txt");

int vFr[101];
int nr;         // numerele din fișier
int s;          // suma curentă pentru o secvență de valori nenule
int Smax;       // suma maximă pentru o secvență de valori nenule
int i;

int main()
{
    // frecvența numerelor
    while (fin>>nr)
        vFr[nr]++;

    // determinăm în vectorul de frecvență o secvență de valori nenule de sumă maximă
    for(i=0; i<=100; i++)
        if (vFr[i]!=0)
            s += vFr[i];    // memorăm suma curentă
        else
        {
            if (Smax<s)     // actualizăm după caz, suma maximă
                Smax=s;

            s=0;            // reactualizăm suma pentru următoarea secvență de valori nenule
        }

    cout << Smax;

    return 0;
}
        

2019 - iarnă

Subiectul III, ex 1

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

Subiectul III, ex 2

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    bool ok=false;
    char S[256],C[31];
    char rimaC[256], rimaP[256];
    int pozC, pozP,i;

    cin.getline(S,256);
    cin.getline(C,256);

    pozC=-1;
    for(i=strlen(C)-1; i>=0; i--)
        if (strchr("aeiou",C[i]))
        {
            pozC=i;
            break;
        }
    strcpy(rimaC,C+pozC);

    char *p=strtok(S," ");
    while(p)
    {
        pozP=-1;
        for(i=strlen(p)-1; i>=0; i--)
            if (strchr("aeiou",p[i]))
            {
                pozP=i;
                break;
            }
        strcpy(rimaP,p+pozP);

        if(strcmp(rimaC, rimaP)==0)
        {
            cout << p << endl;
            ok=true;
        }

        p=strtok(NULL," ");
    }

    if (!ok)
        cout << "NU EXISTA";

    return 0;
}
        

Subiectul III, ex 3

#include <fstream>
#include <iostream>

using namespace std;

ifstream fin("bac.txt");

int vf[10];         // vectorul de frecvență al cifrelor
int i, j;
int cifraMAXpara;
int nrAparitii;
int n;              // numărul de cifre din fișier
int c;              // variabila pentru prelucrarea/parcurgerea cifrelor
int r;              // rețin cifra cu numărul de apariții impare
int gPar;

int main()
{
    fin >> n;
    for(i=1; i<=n; i++)
    {
        fin >> c;     // citirea cifrelor
        vf[c]++;    // frecvența cifrelor
    }

    // verific numărul de apariții impare ale tuturor cifrelor
    for(c=1; c<=9; c++)
        if (vf[c]%2==1)
        {
            nrAparitii++;
            r=c;
        }

    if (nrAparitii>1)
        cout << "-1";
    else
        if (nrAparitii==1)
        {
            // caut cifra maximă pară cu un număr de apariții de cel puțin două ori
            for(c=8; c>=2; c=c-2)
                if (vf[c]>=2)
                {
                    gPar=1;             // am găsit o cifră pară
                    cifraMAXpara = c;   // salvez cifra pară maximă
                    vf[c]-=2;           // scad frecvența cu 2 unități
                    break;
                }
            if (gPar==0)
                cout << "-1";
            else
            {
                cout << cifraMAXpara;           // afișez cifra maximă pară, la început

                for(c=9; c>=1; c--)             // afișez jumătate dintre cifre, descrescător
                    for(j=1; j<=vf[c]/2; j++)
                        cout << c;

                cout << r;                      // plasez cifra cu număr impar de apariție

                for(c=1; c<=9; c++)             // afișez jumătate dintre cifre, crescător
                    for(j=1; j<=vf[c]/2; j++)
                        cout << c;

                cout << cifraMAXpara;           // afișez cifra maximă pară, la sfârșit
            }
        }
        else    // cazul nrAparitii=0
        {
            // caut cifra maximă pară cu un număr de apariții de cel puțin două ori
            for(c=8; c>=2; c=c-2)
                if (vf[c]>=2)
                {
                    gPar=1;             // am găsit o cifră pară
                    cifraMAXpara = c;   // salvez cifra pară maximă
                    vf[c]-=2;           // scad frecvența cu 2 unități
                    break;
                }

            if (gPar==0)
                cout << "-1";
            else
            {
                cout << cifraMAXpara;           // afișez cifra maximă pară, la început

                for(c=9; c>=1; c--)             // afișez jumătate dintre cifre, descrescător
                    for(j=1; j<=vf[c]/2; j++)
                        cout << c;
                for(c=1; c<=9; c++)             // afișez jumătate dintre cifre, crescător
                    for(j=1; j<=vf[c]/2; j++)
                        cout << c;

                cout << cifraMAXpara;           // afișez cifra maximă pară, la sfârșit
            }
        }

    return 0;
}
        

2019 - primăvară

Subiectul III, ex 1

void inserare(int &n)
{
    int p=1;
    int x=0;

    while (n>9)
    {
        // plasarea cifrei (n%10) în numărul x
        x = n%10 * p + x;
        p *= 10;

        // inserarea, între oricare două cifre alăturate ale sale,
        // a valorii absolute a diferenței acestora
        x = abs(n%10-n/10%10) * p + x;
        p *= 10;

        n /= 10;
    }

    // caz aparte: plasarea primei cifre
    x = n * p + x;

    n = x;
}
        

Subiectul III, ex 2

#include <iostream>
#include <cstring>

using namespace std;

char t[500];
char s[51];     // textul inițial

// doar cuvintele din mulțimea 'k' pot fi prescurtate
char k[4][9] = {"COLEGIUL", "LICEUL", "NATIONAL", "TEORETIC"};

char *p;

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

    p=strtok(s," ");
    while (p)
    {
        if ( p[strlen(p)-1]=='.' )
        {
            if (p[0]=='C')
            {
                strcat(t,k[0]);
                strcat(t," ");
            }
            if (p[0]=='L')
            {
                strcat(t,k[1]);
                strcat(t," ");
            }
            if (p[0]=='N')
            {
                strcat(t,k[2]);
                strcat(t," ");
            }
            if (p[0]=='T')
            {
                strcat(t,k[3]);
                strcat(t," ");
            }
        }
        else // nu se termină cu '.'
        {
            strcat(t,p);
            strcat(t," ");
        }

        p=strtok(NULL," ");
    }

    cout << t;

    return 0;
}

Exemplu: pentru COLEG. NAT. DE INFORMATICA
se obține COLEGIUL NATIONAL DE INFORMATICA
        

Subiectul III, ex 3

#include <iostream>
#include <fstream>

// PARITAR

using namespace std;

ifstream fin("bac.txt");
int n, x, i;

/* Primul caz:   (acest caz este inclus în cazul al doilea, așadar nu-l vom trata)
   fiecare dintre primii săi 'n' termeni au aceeași paritate cu oricare dintre ultimii săi 'n' termeni */

/* Al doilea caz:
   fiecare dintre primii săi 'n' termeni este strict mai mic decât
   oricare număr de paritate diferită dintre ultimii săi 'n' termeni */

int maxP=-2;     // cel mai mare număr par dintre primii n termeni
int maxI=-1;     // cel mai mare număr impar dintre primii n termeni

int minP=1e6+2;     // cel mai mic număr par dintre ultimii n termeni
int minI=1e6+1;     // cel mai mic numîr impar dintre ultimii n termeni

int main()
{
    fin >> n;

    // primele n numere din șir
    for(i=1; i<=n; i++)
    {
        fin >> x;

        if (x%2==0)
        {
            if (x > maxP)
                maxP=x;     // cel mai mare număr par dintre primii n termeni
        }
        else
        {
            if (x > maxI)
                maxI=x;     // cel mai mare număr impar dintre primii n termeni
        }
    }

    // ultimele n numere din șir
    for(i=n+1; i<=2*n; i++)
    {
        fin >> x;

        if (x%2==0)
        {
            if (x < minP)
                minP=x;     // cel mai mic număr par dintre ultimii n termeni
        }
        else
        {
            if (x > minI)
                minI=x;     // cel mai mic număr impar dintre ultimii n termeni
        }
    }

    if ( maxP < minI || maxI < minP )
        cout << "DA";
    else
        cout << "NU";

    return 0;
}
        

2019 - specială

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()
{
    int x, y, z;
    int n;

    cin >> n;
    cin >> x >> y >> z;

    do // aflu și afișez elementele șirului
    {
        if (n%2==0)
            fout << y + (z-x) * (n/2-1) << " ";
        else
            fout << x + (z-x) * (n/2) << " ";

        n--;
    }
    while (n);

    return 0;
}

/*

 n=10
 x=1, y=2 și z=4

 14 13 11 10 8 7 5 4 2 1

*/
        

2019 - 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 a, b, maxL, gv;

int main()
{
    fin >> a;
    if (a > maxL)
    {
        maxL = a;
        cout << maxL << ' ';
    }

    while (fin >> b)
    {
        if (b > maxL)
        {
            maxL = b;
            cout << maxL << ' ';
            gv=1;
        }
        else
            if ( b==maxL && gv==1 )
                cout << maxL << ' ';
            else
                gv=0;
    }
    return 0;
}
        

2019 - vară (rezervă)

Subiectul III, ex 1

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

Subiectul III, ex 2

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

Subiectul III, ex 3

#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("bac.txt");

int apx[10];    // marchez cifrele lui x
int apNr[10];   // verific dacă apare în toate numerele

int x;          // numărul curent din fișier din [0,999]
int nr;         // număr câte numere am în fișier

int g;          // testare caz 'nu exista'
int c;          // cifre

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

        // marcăm la început cu 0 fiecare cifra, pentru fiecare x
        for(c=0; c<=9; c++)
            apx[c]=0;

        // --- metoda 1 ---

            do // marcăm cu 1 fiecare cifră a lui x
            {
                if (apx[x%10]==0)
                    apx[x%10]=1;
                x/=10;
            }
            while (x);

            for(c=0; c<=9; c++) // facem marcarea totală
                if (apx[c]==1)
                    apNr[c]++;
    }

    for(c=9; c>=0 && !g; c--)
        if (apNr[c] == nr)
            cout << c, g=1;

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

    return 0;
}

        // --- metoda 2 ---
/*
            do
            {
                if (apx[x%10]==0)
                {
                    apx[x%10]=1;    // marcăm cifra din x
                    apNr[x%10]++;   // marcăm total
                }
                x/=10;
            }
            while (x);
*/
        

2019 - toamnă

Subiectul III, ex 1

int MaxImp(int a, int b)
{
    for(int nr=b; nr>=a; nr--)
    {
        int p=1;
        for(int d=3; d<=nr/2; d=d+2)
            if (nr%d==0)
                p *= d;

        if (p>nr)
            return nr;
    }
    return 0;
}
        

Subiectul III, ex 2

#include <iostream>

using namespace std;
int a[21][21], n;

int verificare(int l, int c);

int main()
{
    cin >> n;

    int i, j, d;
    int dMax=1;

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

    for(i=1; i<=n; i++)
        for(j=1; j<=n; j++)
        {
            d = verificare(i,j);
            if (dMax < d)
                dMax=d;
        }

    cout << dMax;

    return 0;
}

int verificare(int l, int c)
{
    int ok=1;
    int dim=1;

    int ii, jj;

    while (ok)
    {
        ok=1;
        for(ii=l; ii<=l+dim && ok; ii++)
            for(jj=c; jj<=c+dim && ok; jj++)
                if (a[l][c]!=a[ii][jj])
                    ok=0;
        if (ok)
            dim++;
    }
    return dim;
}
        

Subiectul III, ex 3

#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("bac.txt");

int main()
{
    int nr, vf[1001]={0};
    int i; // impare
    int p; // pare

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

    for(i=1; i<=999; i+=2)
    {
        while (vf[i]!=0)
        {
            cout << i << ' ';
            vf[i]--;
        }
    }

    for(p=0; p<=1000; p+=2)
    {
        while (vf[p]!=0)
        {
            cout << p << ' ';
            vf[p]--;
        }
    }

    return 0;
}
        

2020 - model

Subiectul III, ex 1

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

Subiectul III, ex 2

#include <iostream>
#include <cstring>

using namespace std;

int main()
{
    int n, lg1=0, lg2=0;
    char s[101], s1[101] = "", s2[101] = "";

    cin >> n;
    cin.get();
    cin.getline(s,101);

    char *p=strtok(s," ");
    while (p)
    {
        if (strlen(p)>=n)
        {
            strcat(s1,p);
            strcat(s1, " ");
            lg1++;
        }
        else
        {
            strcat(s2,p);
            strcat(s2, " ");
            lg2++;
        }

        p=strtok(NULL, " ");
    }

    if (lg1==0 || lg2==0)
        cout << "nu exista";
    else
    {
        p=strtok(s1, " ");
        while(p)
        {
            cout << p << endl;
            p=strtok(NULL, " ");
        }

        p=strtok(s2, " ");
        while(p)
        {
            cout << p << endl;
            p=strtok(NULL, " ");
        }
    }

    return 0;
}
        

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

void radical(int n, int k, int &a, int &b)
{
    a = 1;
    b = 1;

    for (int d = 2; d*d <= n; d++)
    {
        if (n % d == 0)
        {
            int p = 0;
            while (n % d == 0)
            {
                n /= d;
                p++;
            }

            int pA = p / k;   // partea care intră în a
            int pB = p % k;   // restul care intră în b

            while (pA--) a *= d;
            while (pB--) b *= d;
        }
    }

    if (n > 1)
        b *= n;
}
        

Subiectul III, ex 2

Metoda 1:
parcurgere secvențială cu detectare directă a cuvintelor

#include <iostream>
#include <cstring>
#include <cctype>

using namespace std;

int main()
{
    char s[201];
    cin.getline(s, 201);

    int nrvoc;
    int nrcons;
    
    int i, j, k;
    int L = strlen(s);

    i = 0;
    while (i < L)
    {
        // dacă începe un cuvânt
        if (isalpha(s[i]))
        {
            j = i;
            nrvoc = 0;
            nrcons = 0;

            // merg până la finalul cuvântului
            while (j < L && isalpha(s[j]))
            {
                if (strchr("aeiou", s[j]))
                    nrvoc++;
                else
                    nrcons++;
                j++;
            }

            // dacă nr.V = nr.C atunci transformăm
            if (nrvoc == nrcons)
            {
                for (k = i; k < j; k++)
                    s[k] = 'z' - (s[k]-'a');
            }

            i = j; // sar peste cuvânt
        }
        else
        {
            i++; // sar peste spații
        }
    }

    cout << s;
    return 0;
}

Metoda 2:
tokenizare + vector de spații

#include <iostream>
#include <cstring>

using namespace std;

int main()
{
    char s[201], *p;

    int Vsp[100];
    int nrSp;
    int k=0;

    int i, j, e;

    int nrcons;
    int nrvoc;

    int L;

    cin.getline(s,201);

    // stocarea fiecărei secvențe de spațiu
    for(i=0; s[i]; i++)
    {
        if (s[i] == ' ')
        {
            nrSp=0;
            while (s[i] == ' ')
            {
                nrSp++;
                i++;
            }

            Vsp[k]=nrSp;
            k++;
        }
    }

    Vsp[k]=0;

    // procesăm cuvintele
    p=strtok(s," ");
    e=0;
    while (p)
    {
        nrcons = 0;
        nrvoc  = 0;

        L = strlen(p);
        for(j=0; j < L; j++)
            if (strchr("aeiou",p[j]))
                nrvoc++;
            else
                nrcons++;

        if ( nrvoc == nrcons )
            for(j=0; j < L; j++)
                p[j] = 'z' - (p[j]-'a');

        // afișăm cuvântul, apoi spațiile care urmau după el
        cout << p;
        for(i=1; i<=Vsp[e]; i++)
            cout << ' ';
        e++;

        p=strtok(NULL," ");
    }

    return 0;
}
        

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

anulată, în contextul COVID-19
        

Subiectul III, ex 2

anulată, în contextul COVID-19
        

Subiectul III, ex 3

anulată, în contextul COVID-19
        

2020 - specială

Subiectul III, ex 1

anulată, în contextul COVID-19
        

Subiectul III, ex 2

anulată, în contextul COVID-19
        

Subiectul III, ex 3

anulată, în contextul COVID-19
        

2020 - vară

Subiectul III, ex 1

int suma(int a, int b)
{
    int d;
    int s=0;

    for(d=1; d<=a; d++)
        if (a%d==0 && b%d==0)
            s=s+d;

    return s;
}
        

Subiectul III, ex 2

Metoda 1:

#include <iostream>
#include <cstring>

using namespace std;

int main()
{
    char t[101];    // textul inițial
    char s[101]=""; // textul final
    char *p;

    int g=0;

    cin.getline(t,101);

    p=strtok(t," ");
    while (p)
    {
        if (strlen(p)<=2)
            strcat(s,p);
        else
        {
            strcat(s,p+1);
            strncat(s,p,1);
            g=1;
        }
        strcat(s," ");
        p=strtok(NULL," ");
    }

    if (g)
        cout << s;
    else
        cout << "nu exista";
}

Metoda 2:

#include <iostream>
#include <cstring>

using namespace std;

int main()
{

    char t[101];    // textul inițial
    char r[101];    // rotire spre stânga a unui cuvânt
    char s[101]=""; // textul final
    char *p;

    int g=0;
    int i;

    cin.getline(t,101);

    p = strtok(t," ");
    while (p)
    {
        if (strlen(p)>=3)
        {
            r[0]='\0';
            for(i=0; p[i]; i++)
                r[i]=p[i+1];
            r[strlen(p)-1]=p[0];
            r[strlen(p)]='\0';
            g=1;
        }

        if (strlen(p)>=3)
            strcat(s,r);
        else
            strcat(s,p);

        strcat(s," ");

        p=strtok(NULL," ");
    }

    if (g)
        cout << s;
    else
        cout << "nu exista";

    return 0;
}

   Exemplu:
un palc mic de scolarite ilumina sala
un alcp icm de colarites luminai alas
        

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 - vară (rezervă)

Subiectul III, ex 1

int multiplu(int n)
{
    int i=1, m=0;

    while (m==0)
    {
        if ( (i*i)%n==0 )
            m = i*i;
        i++;
    }
    return m;
}
        

Subiectul III, ex 2

Metoda 1: parcurgere caracter cu caracter

#include <iostream>
#include <cstring>

using namespace std;

int main()
{
    char s[101]; // textul de prelucrat
    int citat = 0; // suntem sau nu în interiorul unui citat
    int i;

    cin.getline(s, 101);

    for(i=0; s[i]; i++)
    {
        if (s[i] == '<')
            citat = 1;
        else
            if (s[i] == '>')
                citat = 0;
            else
                if (citat && s[i] >= 'a' && s[i] <= 'z')
                    s[i] = s[i] - 'a' + 'A';
    }

    cout << s;

    return 0;
}

Metoda 2: pe cuvinte, tokenizare după spațiu

#include <iostream>
#include <cstring>

using namespace std;
int main()
{
    char s[101]; // textul de prelucrat
    char t[101]=""; // textul final
    char *p;

    int i, k;

    cin.getline(s,101);

    k=0;
    p=strtok(s," ");
    while(p)
    {
        if (k==1)
        {
            for(i=0; p[i]; i++)
                if (p[i]=='>')
                    k=0;
                else
                    p[i] = p[i] - 'a' + 'A';
        }

        if (p[0]=='<')
        {
            k=1;
            for(i=1; p[i]; i++)
                if (p[i]=='>')
                    k=0;
                else
                    p[i] = p[i] - 'a' + 'A';
        }

        strcat(t,p);
        strcat(t," ");

        p=strtok(NULL," ");
    }
    cout << t;
}

   Exemplu:

pentru textul:
mai bine sa fii un <om de valoare> decat un <om de succes> 

se afișează:
mai bine sa fii un <OM DE VALOARE> decat un <OM DE SUCCES>
        

Subiectul III, ex 3

#include <iostream>
#include <fstream>
#include <cmath>

using namespace std;

ifstream fin("bac.in");

int main()
{
    int st, nr, dr;
    int dmin = 1000000001; // distanța minimă
    int nrmax = -1; // marcăm că nu am găsit niciun vârf

    fin >> st;
    fin >> nr;

    while (fin >> dr)
    {
        if (st < nr && dr < nr) // 'nr' este vârf
        {
            if (abs(dr - st) < dmin)
            {
                dmin = abs(dr - st);
                nrmax = nr;
            }
            else
                if (abs(dr - st) == dmin && nr > nrmax)
                    nrmax = nr;
        }

        st = nr;
        nr = dr;
    }

    if (nrmax == -1)
        cout << "nu exista";
    else
        cout << nrmax;

    return 0;
}

   Exemplu:

dacă fișierul conține șirul:
2 7 10 5 6 2 1 3 20 17 9 13 7 3 10 6 2  1 3 20 17 9 11 7 3 10 6 2 

se afișează pe ecran 13.
        

2020 - toamnă

Subiectul III, ex 1

int kpn(int a, int b, int k)
{
    int s, nr, d;

    for(nr=a; nr<=b; nr++)          // parcurg numerele din intervalul [a,b]
    {
        s=1+nr;                     // suma inițială
        for(d=2; d<=nr/2; d++)
            if (nr%d==0)            // dacă este divizor
                s=s+d;              // îl adaug la suma noastră

        if (nr%2==s%2)              // aceeași paritate p-număr
            k--;

        if (k==0)
            return nr;
    }

    return -1;
}
        

Subiectul III, ex 2

#include <iostream>
#include <cstring>

using namespace std;

int g;       // am sau nu am găsit cuvinte în oglindă
int i, L;
char t[101]; // textul inițial
char o[101]; // cuvântul în oglindă
char s[101]; // textul obținut
char *p;

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

    p=strtok(t," ");
    while (p)
    {
        L = strlen(p);
        if (L%2!=0) // cuvânt cu număr impar de litere
        {
            o[0]='\0';
            for(i=0; i < L; i++)
                o[i]=p[L-i-1];
            o[L]='\0';

            if (strcmp(p,o)!=0)
            {
                strcat(s,o);
                g=1;
            }
            else
                strcat(s,p);
        }
        else
            strcat(s,p);

        strcat(s," ");

        p=strtok(NULL," ");
    }

    if (g)
        cout << s;
    else
        cout << "nu exista";

    return 0;
}

   Exemplul 1:

t = "era o selectie reper de desene animate prezenta"
s = "are o selectie reper de desene etamina prezenta"

   Exemplul 2:

t = "un reper pentru desene"
nu exista
        

Subiectul III, ex 3

Metoda 1, cu 3 variabile:

#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("bac.txt");

int nr;

int y=9;   // cel mai mare
int x=100; // cel mai mic

int main()
{
    while (fin >> nr)
    {
        if ( 9 < nr && nr < 100 )
        {
            if (y < nr)
                y = nr;

            if (x > nr)
                x = nr;
        }
    }

    if ( x < 100 && y > 9)
        cout << x-1 << ' ' << y+1;
    else
        cout << "nu exista";

    return 0;
}


Metoda 2, cu 5 variabile:

#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("bac.txt");

int nr;

int okx;
int oky;

int y=10; // cel mai mare
int x=99; // cel mai mic

int main()
{
    while (fin >> nr)
    {
        if ( 9 < nr && nr < 100 )
        {
            if (y < nr)
                y = nr, oky = 1;

            if (x > nr)
                x = nr, okx = 1;
        }
    }

    if (okx && oky)
        cout << x-1 << ' ' << y+1;
    else
        cout << "nu exista";

    return 0;
}

   Exemplul 1:

bac.txt   7 2 40 5 11 15 10 122 18 350
se afișează: 9 41


   Exemplul 2:
   
bac.txt   7 2 406 5 171 1775 0 140 1 8 341750
se afișează: nu exista
        

2021 - model

Subiectul III, ex 1

void prime (int n, int &x, int &y)
{
    int i;
    int ok=0;
    int p;
    int d;

    for(i=n-1; i>=1; i--)
    {
        p=1;

        if (i < 2)    p=0;
        if (i == 2)   p=1;
        if (i%2 == 0) p=0;

        for (d = 3; d * d <= i && p; d += 2)
            if (i % d == 0)
                p = 0;

        if (p)
        {
            if (ok==0)
            {
                y=i;
                ok++;
            }
            else if (ok==1)
            {
                x=i;
                ok++;
            }
            else if (ok==2) break;
        }
    }
}

   Exemplu:
dacă n=49, în urma apelului x=43 și y=47.
        

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

anulată, în contextul COVID-19
        

Subiectul III, ex 2

anulată, în contextul COVID-19
        

Subiectul III, ex 3

anulată, în contextul COVID-19
        

2021 - primăvară

Subiectul III, ex 1

int putere(int n)
{
    int pmin=100; // puterea cea mai mică a numărului cerut
    int fmin;     // numărul prim care apare la puterea cea mai mică

    int p;        // puterea factorului curent
    int f=2;      // factorul prim din descompunere

    while (n!=1)
    {
        p=0;
        while (n%f==0)
        {
            p++;
            n=n/f;
        }

        if (p)
        {
            if ( p < pmin )
            {
                pmin = p;
                fmin = f;
            }
        }

        f++;
    }
    return fmin;
}

   Exemplu:
dacă n=880, subprogramul returnează numărul 5.
        

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

void divPrim(int n, int &s)
{
    int dp=2; // divizor prim
    int p;    // puterea

    s=0;      // suma

    while (n!=1)
    {
        if (n%dp==0)
        {
            p=0;
            while (n%dp==0)
            {
                n/=dp;
                p++;
            }

            if (p%2==1)
                s+=dp;
        }
        dp++;
    }
}

   Exemple:

pentru n=360, după apel s=7
pentru n= 16, după apel s=0.
        

Subiectul III, ex 2

#include <iostream>
#include <cstring>

using namespace std;

int main()
{
    char cuv[11];       // cuvintele inițiale
    char l[20][11]={0}; // lista primelor 'k' cuvinte

    int n, k;
    int nr=0;    // numărul de cuvinte pentru care ultima literă este vocală
    int i;

    cin >> n >> k;

    for(i=1; i<=n; i++)
    {
        cin >> cuv;

        // mai am nevoie de cuvinte, nr < k
        // este acesta un cuvânt valid?

        if ( nr < k && strchr("aeiou", cuv[strlen(cuv)-1]) )
        {
            strcpy(l[nr], cuv);
            nr++;
        }
    }

    if (nr < k)
        cout << "nu exista";
    else
        for(i=0; i < k; i++)
            cout << l[i] << endl;

    return 0;
}

   Exemplu:

dacă se citesc datele

5 2 
norii 
cumulus 
pluteau 
pe 
cer

atunci se afișează pe ecran:

norii 
pluteau
        

Subiectul III, ex 3

#include <iostream>
#include <fstream>

using namespace std;

ifstream fin ("bac.txt");

int x; // îl au drept sufix pe numărul 'x' din [100,999]

int n1, n2;

int u1 = -1; // ultimii doi termeni ai șirului,
int u2 = -1; // aflați pe poziții consecutive

int main()
{
    fin >> x;
    fin >> n1;

    while (fin >> n2)
    {
        if (n1%1000==x  &&  n2%1000==x)
        {
            u1 = n1;
            u2 = n2;
        }
        n1 = n2;
    }

    if (u1!=-1 && u2!=-1)
        cout << u1 << ' ' << u2;
    else
        cout << "nu exista";

    return 0;
}

   Exemplu:

    Dacă fișierul bac.txt conține
210
3445 210 893210 1245 1210 3210 15210 67120 20210 12

atunci pe ecran se afișează 3210 15210
        

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

#include <iostream>
#include <cstring>

using namespace std;

int main()
{
    char invitat[251], *Pinv;
    char nume[251], prenume[251];
    char x[21]; // cuvântul de identificat

    int g=0;
    int poz;    // poziția spațiului dintre 'nume' și 'prenume'
                // pentru fiecare invitat

    cin.getline(invitat,251);
    cin >> x;

    // generez invitații
    Pinv = strtok(invitat,";");

    while (Pinv) // cât timp am invitați
    {

        if (Pinv[0] != ' ')
            poz = 0; // cazul primului invitat
        else
            poz = 1; // cazul pentru restul invitaților

        while (Pinv[poz] != ' ' && Pinv[poz] != '\0')
            poz++;


        /// extrag numele
        if (Pinv[0]!=' ')   // cazul primului invitat
        {
            strncpy(nume, Pinv, poz);
            nume[poz]='\0';
        }
        else                // cazul pentru restul invitaților
        {
            strncpy(nume, Pinv, poz);
            nume[poz]='\0';
            strcpy(nume, nume+1);
        }

        /// extrag prenumele
        strcpy(prenume, Pinv + poz + 1);

        // compar
        if (strcmp(nume,x)==0)
        {
            cout << prenume << ' ';
            g=1;
        }

        // trec la următorul invitat
        Pinv = strtok(NULL, ";");
    }

    if (!g)
        cout << "NU";

    return 0;
}

   Exemplu:
   
dacă lista este:
DAN MARIS; DANILA PREPELEAC; DAN POPA; EDANA DAN; 
și cuvântul 'x' este DAN

se afișează pe ecran MARIS POPA
        

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;
}

   Exemplu:

 dacă n=14, fișierul conține numărul 2,
 unde 452=2025 este divizor al lui 1∙2∙3∙..∙14 = 87178291200
        

2022 - specială

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, y;
int lgC;    // lungimea curentă a unei secvențe progresive
int lgCMax; // lungimea curentă maximă pentru o secvență progresivă
int solMax; // lungimea maximă cerută

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

    while (fin>>y)
    {
        if (x==y)
            lgC++;
        else
            if (lgC==x)
            {
                lgCMax = lgCMax + lgC;
                if (lgCMax > solMax)
                    solMax = lgCMax;
                lgC = 1;
            }
            else
            {
                lgCMax = 0;
                lgC = 1;
            }
        x=y;
    }

    // actualizare pentru ultima secvență posibilă
    if (lgC==x)
    {
        lgCMax = lgCMax + lgC;
        if (lgCMax>solMax)
            solMax = lgCMax;
    }

    cout << solMax;

    return 0;
}

    Exemplu:

dacă fişierul conţine numerele 1 2 2 3 4 4 4 4 6 6 6 6 6 6 7 7 7 8 8 8 8 8 8 8 8   
atunci pe ecran se afișează valoarea 10.
        

2022 - vară

Subiectul III, ex 1

void secventa(int &n)
{
    int t=0, p=1;

    while (n)
    {
        if (n%100==22)
        {
            p=p*10;
            t=t+2*p;
            p=p*10;
            n=n/100;
        }
        else
        {
            t=t+p*(n%10);
            p=p*10;
            n=n/10;
        }
    }
    n=t;
}

   Exemplu:
   
dacă n=202233228, după apel n=202033208.
        

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

#include <fstream>
#include <iostream>

using namespace std;

ifstream fin ("bac.txt");

int x, y;   // intervalul de studiu

int a;      // valoarea anterioară
int c;      // valoarea curentă

int k;      // numărul de valori distince din [x,y]

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

    // găsim prima valoare din intervalul [x,y]
    while (fin >> a)
        if (x<=a && a<=y)
        {
            k=1;
            break;
        }

    // numărăm următoarele valori distincte din intevalul [x,y]
    while (fin >> c && c<=y)
    {
        if (a!=c)
            if (x<=c && c<=y)
                k++;
        a=c;
    }

    cout << k;

    return 0;
}

   Exemplu:

dacă fişierul are conținutul
2 9 
1 1 1 2 2 3 5 5 5 5 6 6 7 8 10 10 12 15 21 21

atunci pe ecran se afişează
6
        

2022 - toamnă

Subiectul III, ex 1

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

Subiectul III, ex 2

Metoda 1: pe grupuri de caractere

#include <iostream>
#include <cstring>

using namespace std;

int main()
{
    // parola
    char p[51];

    // codificare
    char pa[] = "bcd";
    char pe[] = "fgh";
    char pi[] = "jklmn";
    char po[] = "pqrst";
    char pu[] = "vwxyz";

    cin.getline(p, 51);

    for (int i = 0; p[i]; i++)
    {
        if (strchr(pa, p[i]))
            p[i] = 'a';
        if (strchr(pe, p[i]))
            p[i] = 'e';
        if (strchr(pi, p[i]))
            p[i] = 'i';
        if (strchr(po, p[i]))
            p[i] = 'o';
        if (strchr(pu, p[i]))
            p[i] = 'u';
    }

    cout << p;

    return 0;
}

Metoda 2: pe intervale cu 'switch'

#include <iostream>

using namespace std;

int main()
{
    char p[51], c;
    cin.getline(p, 51);

    for(int i = 0; p[i]; i++)
    {
        c = p[i];

        switch (c)
        {
            case 'b': case 'c': case 'd':
                p[i] = 'a';
                break;

            case 'f': case 'g': case 'h':
                p[i] = 'e';
                break;

            case 'j': case 'k': case 'l': case 'm': case 'n':
                p[i] = 'i';
                break;

            case 'p': case 'q': case 'r': case 's': case 't':
                p[i] = 'o';
                break;

            case 'v': case 'w': case 'x': case 'y': case 'z':
                p[i] = 'u';
                break;
        }
    }

    cout << p;

    return 0;
}

Metoda 3: mapare

#include <iostream>

using namespace std;

int main()
{
    // parola
    char p[51];

    cin.getline(p, 51);

    // mapare directă pentru fiecare literă
    char m[26] = {
        'a', // a
        'a', // b
        'a', // c
        'a', // d
        'e', // e
        'e', // f
        'e', // g
        'e', // h
        'i', // i
        'i', // j
        'i', // k
        'i', // l
        'i', // m
        'i', // n
        'o', // o
        'o', // p
        'o', // q
        'o', // r
        'o', // s
        'o', // t
        'u', // u
        'u', // v
        'u', // w
        'u', // x
        'u', // y
        'u'  // z
    };

    for(int i = 0; p[i]; i++)
        p[i] = m[p[i] - 'a'];

    cout << p;

    return 0;
}

   Exemple:

pentru parola rame se afişează oaie
pentru parola sport se afișează ooooo 
        

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

#include <iostream>

using namespace std;

int a[100][100];

void citire(int &n, int &m)
{
    cin >> n >> m;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            cin >> a[i][j];
}

void gasesteMinMax(int n, int m, int &minL, int &minC, int &maxL, int &maxC)
{
    int minVal = a[0][0], maxVal = a[0][0];
    minL = minC = maxL = maxC = 0;

    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
        {
            if (a[i][j] < minVal)
            {
                minVal = a[i][j];
                minL = i;
                minC = j;
            }
            if (a[i][j] > maxVal)
            {
                maxVal = a[i][j];
                maxL = i;
                maxC = j;
            }
        }
}

void eliminaLinie(int &n, int m, int L)
{
    for (int i = L; i < n - 1; i++)
        for (int j = 0; j < m; j++)
            a[i][j] = a[i + 1][j];
    n--;
}

void eliminaColoana(int n, int &m, int C)
{
    for (int j = C; j < m - 1; j++)
        for (int i = 0; i < n; i++)
            a[i][j] = a[i][j + 1];
    m--;
}

void afisare(int n, int m)
{
    cout << n << ' ' << m << '\n';
    for (int i = 0; i < n; i++, cout << '\n')
        for (int j = 0; j < m; j++)
            cout << a[i][j] << " ";
}

int main()
{
    int n, m;
    citire(n, m);

    int minL, minC, maxL, maxC;
    gasesteMinMax(n, m, minL, minC, maxL, maxC);

    // eliminăm liniile,
    // în ordine descrescătoare ca să nu stricăm indexarea

    if (minL > maxL)
        swap(minL, maxL);

    if (minL != maxL) {
        eliminaLinie(n, m, maxL);
        eliminaLinie(n, m, minL);
    } else {
        eliminaLinie(n, m, minL);
    }

    // eliminăm coloanele
    // în ordine descrescătoare ca să nu stricăm indexarea

    if (minC > maxC)
        swap(minC, maxC);

    if (minC != maxC) {
        eliminaColoana(n, m, maxC);
        eliminaColoana(n, m, minC);
    } else {
        eliminaColoana(n, m, minC);
    }

    afisare(n, m);

    return 0;
}
        

Subiectul III, ex 3

Metoda 1: eficientă

#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 în 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.

Metoda 2: neeficientă

#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("bac.in");

char s[100001];
int x, k;
int f1, f2, f3;

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

    fin.getline(s,100001);

    if (k==1)
        cout << x;
    else
        if (k==2)
            cout << x+1;
        else
        {
            if (x<=8)
            {
                f1 = 1;
                f2 = 1;
                f3 = 2;

                while (f3!=k)
                {
                    f3 = f1 + f2;
                    f1 = f2;
                    f2 = f3;
                }
                for (int i = 0 ; i < f1; i++)
                    cout << s[i];
            }

            if (x==9)
            {
                f1 = 1;
                f2 = 2;
                f3 = 3;

                while (f3!=k)
                {
                    f3 = f1 + f2;
                    f1 = f2;
                    f2 = f3;
                }
                for (int i = 0 ; i < f1; i++)
                    cout << s[i];
            }

            if (x>=10)
            {
                f1 = 2;
                f2 = 2;
                f3 = 4;

                while(f3!=k)
                {
                    f3 = f1 + f2;
                    f1 = f2;
                    f2 = f3;
                }
                for (int i = 0 ; i < f1; i++)
                    cout << s[i];
            }
        }
    return 0;
}
        

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

#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("bac.in");

int main()
{
    int x;

    int minc =  1000000001;
    int maxc = -1000000001;

    int p = 0;
    int pmin = 0, pmax = 0;

    while (fin >> x)
    {
        p++;

        if (x >= minc && x <= maxc)
        {
            if (pmin == 0)
                pmin = p;
            pmax = p;
        }
        else
        {
            if (x < minc) minc = x;
            if (x > maxc) maxc = x;
        }
    }

    if (pmin == 0)
        cout << "nu exista";
    else
        cout << pmin << ' ' << pmax;

    return 0;
}

   Exemple:

 Dacă fișierul conține numerele 2 7 1 8 3 10 6 -3 -2 13,
 se afișează pe ecran 5 9. 
 Intervale conform cerinței se obțin pentru valorile 5, 7 și 9 ale lui p.
 
 Dacă fișierul conține numerele 2 7 1 0 8 10 -3 13,
 se afișează pe ecran 'nu exista'.
        

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

void DNPI(int n)
{
    int i, d, ok;

    cout << 1 << ' '; // 1 este divizor impar și nu este prim

    for(i=3; i<=n; i=i+2) // doar numere impare
    {
        if (n%i==0) // doar divizorii lui n
        {
            ok=0;
            for(d=2; d*d<=i; d++)
                if(i%d==0)
                    ok++; // dacă are divizori, atunci nu este prim
            if(ok!=0)
                cout << i << ' ';
        }
    }
}

   Exemplu:

pentru n=90,
se afișează pe ecran numerele 1 9 15 45 
        

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];

    // un pătrat 2x2 cu colțul dreapta-jos în (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;
}

    Exemplu:

pentru m=5, n=4 și tabloul de mai jos
1  1  2 30 
3 10  1  2 
1 13 12  1 
1  2  3  1 
7  1 20  1

se afișează pe ecran valoarea 36.
        

Subiectul III, ex 3

#include <iostream>
#include <fstream>

using namespace std;

ifstream fin ("date.in");

int m, n;
int i, x;
int A[100], B[100];

int nrP; // numărul de perechi

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

    for(i=1; i<=m; i++)
    {
        fin >> x;
        A[x]++;
    }
    for(i=1; i<=n; i++)
    {
        fin >> x;
        B[x]++;
    }

    for(i=0; i<=99; i++)
    {
        if (A[i] < B[i])
            nrP += A[i];
        else
            nrP += B[i];
    }

    cout << nrP;

    return 0;
}

   Exemplu:
   
dacă fișierul conține numerele
8 9 
1 0 4 1 5 3 5 5 
1 1 1 7 5 3 5 3 0

atunci se afișează pe ecran 6.
        

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ă (antrenament)

Subiectul III, ex 1

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

Subiectul III, ex 2

#include <iostream>
#include <cstring>

using namespace std;

int main()
{
    char s[251], t;

    int n, i;
    int cuvm = 0, cuvn = 0;
    int mod = 0; // 1 dacă s-a modificat cuvântul curent

    bool v1, v2; // vocale consecutive
    bool c1, c2; // consoane consecutive

    cin.getline(s, 251);

    n = strlen(s);

    for(i=1; i < n; i++) {

        // dacă am două litere consecutive în același cuvânt
        if (s[i] != ' ' && s[i-1] != ' ')
        {
            v1 = strchr("aeiou", s[i-1]);
            v2 = strchr("aeiou", s[i]);
            c1 = (s[i-1] >= 'a' && s[i-1] <= 'z' && !v1);
            c2 = (s[i]   >= 'a' && s[i]   <= 'z' && !v2);

            if ( (v1 && v2) || (c1 && c2) )
            {
                t = s[i];
                s[i] = s[i-1];
                s[i-1] = t;
                mod = 1; // am modificat cuvântul curent
            }
        }

        // final de cuvânt
        if (s[i] == ' ' && s[i-1] != ' ')
        {
            if (mod)
                cuvm++;
            else
                cuvn++;

            mod = 0;
        }
    }

    // ultimul cuvânt (dacă nu se termină cu spațiu)
    if (n > 0 && s[n-1] != ' ')
    {
        if (mod)
            cuvm++;
        else
            cuvn++;
    }

    cout << s << '\n';
    cout << cuvm << ' ' << cuvn;

    return 0;
}

   Exemplu:

pentru șirul:
bacalaureatul la  informatica       este foarte usor

se va afișa pe ecran: 
bacaluaraetul la  ifnomratica       etse faotre usor
4 2

   Observație: cuvintele 'la' şi 'usor' nu au fost modificate. 
        

Subiectul III, ex 3

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

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; // afișez cuvintele palindrom distincte

        // 'sar' peste cele care se repetă
        while (i > 0 && strcmp(pal[i], pal[i - 1]) == 0)
            i--;
    }

    return 0;
}

   Exemplu:

dacă se citește șirul
ana am stricat aerisirea cu un cojoc cand ma urcam in dud urmarind un cuc rar din alt dud care era foarte sus

se afișează pe ecran:

aerisirea 
ana 
cojoc 
cuc 
dud 
rar 
sus
        

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 && n!=0)
    {
        // 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;
}

   Exemplu:

pentru fișierul bac.txt cu următorul conținut:
5678 12 1020 6 78 40803 11001 33 0 

se va afișa pe ecran valoarea 9.
        

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

Metoda 1:

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;
}

Metoda 2:

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

#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("bac.txt");

int main()
{
    int x; // anul calendaristic
    int c1, c2; // codul unei mașini de epocă
    int i1, i2; // identificatorii colecționarilor care dețin ultimele două mașini

    int gasit = 0;

    fin >> x;
    fin >> c1;

    while (fin >> c2)
    {
        if (c1 % 10000 == x && c2 % 10000 == x)
        {
            i1 = c1 / 10000;
            i2 = c2 / 10000;
            gasit = 1;
        }
        c1 = c2;
    }

    if (gasit)
        cout << i1 << ' ' << i2;
    else
        cout << "nu exista";

    return 0;
}

   Exemplu:

dacă fișierul 'bac.txt' conține numerele 

1925
31885 21925 8931925 31925 121900 11925 31925 151925 61950 201925 121880

atunci pe ecran se afișează 3 15.
        

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

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

2026 - model

Subiectul III, ex 1

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

Subiectul III, ex 2

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

Subiectul III, ex 3

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

2026 - iarnă

Subiectul III, ex 1

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

Subiectul III, ex 2

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

Subiectul III, ex 3

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

2026 - primăvară

Subiectul III, ex 1

--- Metoda 1, recomandată: cu formula a*b = (a,b) * [a,b]

int cmmdc(int a, int b)
{
    int r;
    while (b)
    {
        r = a%b;
        a = b;
        b = r;
    }
    return a;
}

int depozit(int x, int y, int z)
{
    int c, C;
    c = x*y / cmmdc(x,y);
    C = c*z / cmmdc(c,z);

    return C;
}

--- Metoda 2: cu calcul pentru CMMMC

int depozit(int x, int y, int z)
{
    int a, b;
    int i, j;

    a=x;
    b=y;

    while (a!=b)
    {
        if (a>b)
            b=b+y;
        else
            a=a+x;
    }

    i=a;
    j=z;

    while (i!=j)
    {
        if (i>j)
            j=j+z;
        else
            i=i+a;
    }

    return i;
}

--- Metoda 3: prin forma 'brută'

int depozit(int x, int y, int z)
{
    int d=1;

    while (d%x!=0 || d%y!=0 || d%z!=0)
        d++;

    return d;
}
        

Subiectul III, ex 2

#include <iostream>
#include <cstring>

using namespace std;

int main()
{
    char t[101];// textul pentru criptare

    int c[3];   // codurile unui cifru: c[0], c[1], c[2]
                // din intervalul [0, 25]
    int i;

    cin >> c[0] >> c[1] >> c[2];
    cin.get();
    cin.getline(t,101);

    // eliminăm spațiile
    i = 0;
    while (t[i] != '\0')
    {
        while (t[i] == ' ')
            strcpy(t+i, t+i+1);
        i++;
    }

    // aplicăm codurile
    for(i=0; t[i]; i++)
    {
        if (t[i] + c[i%3] > 'Z')
            t[i] = t[i] + c[i%3] - ('Z' - 'A' + 1);
        else
            t[i] = t[i] + c[i%3];
    }

    cout << t;

    return 0;
}

Exemplu:

c       3 1 6
t       PIXEL  BINE           MAPAT

i   0123456789...       // indicii
    0120120120...       // i%3

t - PIXELBINEMAPAT
    31631631631631
    SJDHMHLOKPBVDU
        

Subiectul III, ex 3

#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("bac.txt");

int x, y;   // intervalul de studiu

int ant;    // valoarea anterioară
int crt;    // valoarea curentă

int nr;     // numărul de valori pare distincte din [x,y]

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

    while (fin >> crt)
    {
        if (x<=crt && crt<=y && crt%2==0 && ant!=crt)
            nr++;
        ant = crt;
    }

    cout << nr;

    return 0;
}

   Exemplu:

dacă fişierul are conținutul
6 11 
1 1 1 2 2 3 5 5 5 5 6 6 7 8 10 10 12 15 15 21 21

atunci pe ecran se afișează
3
        

2026 - specială

Subiectul III, ex 1

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

Subiectul III, ex 2

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

Subiectul III, ex 3

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

2026 - vară

Subiectul III, ex 1

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

Subiectul III, ex 2

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

Subiectul III, ex 3

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

2026 - toamnă

Subiectul III, ex 1

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

Subiectul III, ex 2

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

Subiectul III, ex 3

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