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