Sunteți pe pagina 1din 42

Problema 1

În fişierul Numere.txt pe prima linie este memorat un număr natural n (n<10000), iar pe linia
următoare un
şir de n numere naturale distincte cu maximum 4 cifre fiecare, separate prin câte un spaţiu. Se
cere:
a) Afişaţi pe prima linie a fişierului de ieşire Rezultat.out poziţia pe care s-ar găsi primul element
din şirul
aflat pe linia a doua a fişierului, dacă şirul ar fi ordonat crescător. Numerotarea poziţiilor
elementelor în
cadrul şirului este de la 1 la n. Alegeţi un algoritm de rezolvare eficient din punct de vedere al
memoriei
utilizate şi al timpului de executare.
b) Verificaţi dacă primul număr de pe a doua linie din fişier este număr prim şi afişaţi un mesaj
corespunzător, pe a doua linie a fişierului de ieşire (DA sau NU). Veţi folosi un subprogram care
primeşte
ca parametru un număr natural x, de cel mult 4 cifre si returnează TRUE dacă numărul x este
prim sau
FALSE în caz contrar.
Exemplu: Dacă fişierul Numere.txt are următorul conţinut:
6
267 13 45 628 7 79
Fişierul Rezultat.out va avea următorul conţinut:
5
NU
deoarece numărul 267 ar ocupa poziţia a cincea în şirul ordonat crescător (7 13 45 79 267 628)
şi 267 nu
este număr prim.
REZOLVARE

#include <iostream>
#include <fstream>
using namespace std;
fstream f("date.in");
ofstream g("rezultate.out");
int prim (int x)
{
if(x<2) return 0;
if(x==2) return 1;
if(x%2==0) return 0;
int d;
d=3;
while(d*d<=x)
{
if(x%d==0) return 0;
d=d+2;
}
return 1;
}
int main()
{
int n,y,x,k=0;
f>>n>>x;
while(f>>y)
if(y<x) k++;
g<<k+1<<endl;
if(prim(x)==1)g<<"DA";
else g<<"NU";
f.close();
g.close();
return 0;
}
Problema 2
Fişierul text Numere.txt conţine pe prima linie numărul natural n, (1≤n≤30000), pe următoarele n
linii un şir
de n numere naturale, iar pe ultima linie două numere naturale a şi b (a≤b) separate de un
spaţiu. Fiecare
dintre cele n numere, precum şi valorile a şi b, au cel mult două cifre. Se cere:
a) Afişaţi pe prima linie in fişierul Rezultat.out cel mai mic număr întreg din intervalul închis [a,b]
care se
găseşte în şirul dat. Dacă nu există un astfel de număr, programul afişează textul NU EXISTA.
Alegeţi un
algoritm de rezolvare eficient din punct de vedere al memoriei utilizate şi al timpului de
executare.
b) Pe a doua linie din fişierul de ieşire afişaţi cmmmc dintre a şi b. Pentru calculul celui mai mic
multiplu
comun a două numere se va utiliza un subprogram care primeşte ca parametri două numere
naturale x şi y
şi returnează cmmdc al lor. Reamintim că cmmmc(x,y)= ),(
*
yxcmmdc
yx

Exemplu: Dacă fişierul Numere.txt are următorul conţinut:


4
7
20
11`
35
9 21
Fişierul Rezultat.out va avea următorul conţinut:
11
63
REZOLVARE
#include <iostream>
#include <fstream>
using namespace std;
fstream f("date.in");
ofstream g("rezultate.out");
int v[100];
int cmmdc (int x,int y)
{int r;
r=x%y;
while(r!=0)
{x=y;
y=r;
r=x%y;}
return y;}

int main()
{
int n,x,i,a,b,minim;
f>>n;
for(i=1;i<=n;i++) {f>>x; v[x]=1;}
f>>a>>b;
minim=b+1;
x=a;
while(x<=b)
if(v[x]==1) {minim=x;
x=b+1;}
else x++;
if (minim<=b) g<<minim<<endl;
else g<<"NU EXISTA";
x=a*b;
g<<x/cmmdc(a,b);
f.close();
g.close();
return 0;
}
Problema 3
Fişierul text Numere.in conţine pe prima linie un număr natural nenul n, (2≤n≤100) şi pe
următoarea linie n
numere reale pozitive, în ordine strict crescătoare, separate prin câte un spaţiu.
a) Utilizând un algoritm eficient din punct de vedere al execuţiei şi al memoriei utilizate,
determinaţi şi
afişaţi pe prima linie în fişierul Numere.out cel mai mare număr natural x, cu proprietatea că în
orice
interval deschis având drept capete două numere de pe poziţii alăturate dintre cele n numere
aflate pe
linia a doua în fişierul Numere.in se găsesc cel puţin x numere întregi.
b) Afişaţi numărul de cifre distincte din numărul x utilizând un subprogram care primeşte prin
intermediul
parametrului y un număr natural si returnează prin cel de-al doilea parametru z numărul cifrelor
distincte
ale numărului y.
Exemplu: Dacă fişierul Numere.in are următorul conţinut:
5
3.5 323.1 549 925.3 1312.7
Fişierul Numere.out va avea următorul conţinut:
225
2
Explicaţie: În intervalul (3.5, 323.1) există 320 de numere întregi, în (323.1 , 549) există 225 de
numere
întregi, în (549, 925.3) există 376 de numere întregi, în (925.3, 1312.7) există 387 numere
întregi, deci în
oricare dintre intervale există cel puţin 225 de numere întregi. Numărul 225 este format din două
cifre
distincte.
REZOLVARE
#include <iostream>
#include <fstream>
using namespace std;
fstream f("date.in");
ofstream g("date.out");

int nrnum(float a, float b)


{int x,y; x=a; y=b;
if(y==b) return y-x-1;
else return y-x;}

void cifredis(int y, int &z)


{int v[10]={0}, i;
while(y!=0) {v[y%10]=1;
y=y/10;}
z=0;
for(i=0;i<=9;i++) if(v[i]==1) z++;}

int main()
{ float x,y;
int n,k,minim;
f>>n>>x>>y;
minim=nrnum(x,y);
x=y;
while(f>>y)
{if(nrnum(x,y)<minim) minim=nrnum(x,y);
x=y;}
g<<minim<<endl;
cifredis(minim,k);
g<<k;
f.close();
g.close();
return 0;
}
Problema 4
Se consideră fişierul text Date.in ce conţine pe prima linie două numere naturale nenule, n şi s
(n≤9, s&lt;20),
iar pe a doua linie n numere întregi, separate prin câte un spaţiu, fiecare număr având
maximum 9 cifre
nenule.
a) Afişaţi în fişierul de ieşire Date.out, despărţite prin câte un spaţiu, numerele situate pe a doua
linie a
fişierului Date.in, a căror sumă a cifrelor este mai mică decât s, ordonate strict crescător. În
cazul în
care nu există niciun astfel de număr în fişierul de ieşire se va afişa valoarea 0. Veţi folosi un
subprogram
numit cifre, care primeşte prin intermediul primului parametru, a, un număr întreg cu maximum 9
cifre
nenule şi returnează, prin intermediul celui de-al doilea parametrul b, suma cifrelor lui a.
b) Pe o doua linie a fişierului Date.out afişaţi cel mai mic număr natural format din cifrele
distincte ale
numerelor afişate pe prima linie în fişierul Date.out.
Exemplu: Dacă fişierul Date.in are următorul conţinut:
6 18
321 175 999 242477 16 -269
Fişierul Date.out va avea următorul conţinut:
-269 16 175 321
1235679
REZOLVARE
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("date.in");
ofstream g("date.out");
int w[10];
void cifre(int a,int &b)
{
int b=0;
while(a)
{
b=b+a%10;
a=a/10;}}
int main()
{
int n,s,x,k=0,v[10],p,i;
f>>n>>s;
while(f>>x)
{ cifre(x,p);
if(p<s) {k++; v[k]=x;}}
if(k==0) g<<0<<endl;
else
{for(i=1; i<k; i++)
for(j=i+1; j<=k; j++)
if(v[i]>v[j])
{
x=v[i];
v[i]=v[j];
v[j]=x;
}
for(i=1;i<=k;i++) g<<v[i]<<" ";
g<<endl;}

for(i=1;i<=k;i++)
{while(v[i]) {w[v[i]%10]=1;
v[i]=v[i]/10;}}
for(i=1;i<=9;i++)
{if(w[i]==1) g<<i;}
f.close();
g.close();
return 0;}
Problema 5

Fişierul text Date.in conţine cel puţin două şi cel mult 10000 de numere naturale distincte, dintre
care cel
puţin două sunt pare. Numerele sunt separate prin câte un spaţiu şi fiecare dintre ele are cel
puţin 3 si cel
mult 9 cifre.
a) Determinaţi cele mai mari două numere pare din fişier, utilizând un algoritm eficient din punct
de vedere
al timpului de executare şi al spaţiului de memorie utilizat. Cele două numere vor fi afişate în pe
prima
linie a fişierului de ieşire Rezultate.out, în ordine descrescătoare, separate printr-un spaţiu.
b) Construiţi în memorie o matrice pătratică cu n linii si n coloane, unde n este numărul de cifre
al primului
număr scris în fişierul de ieşire. Matricea va fi construită astfel: pe diagonala principală va
conţine 0,
deasupra diagonalei principale cea mai mare cifră, iar sub diagonala principală cea mai mică
cifră a
acestui număr. Matricea va fi afişată pe următoarele n linii în fişierul Rezultate.out, elementele
fiecărei
linii fiind separate de câte un singur spaţiu. Veţi utiliza un subprogram care primeşte ca
parametru un
număr natural a de cel mult 9 cifre şi returnează prin intermediul parametrilor n, max, min
numărul de
cifre, cifra maximă, respectiv cifra minimă a numărului a.
Exemplu: Dacă fişierul Date.in are următorul conţinut:
5123 610 301 122 824
Fişierul Rezultate.out va avea următorul conţinut:
824 610
088
208
220
REZOLVARE
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("date.in");
ofstream g("date.out");
void maxmin(int a,int &n,int &maxim,int &minim)
{maxim=-1; minim=10;n=0;
while(a)
{if(maxim<(a%10)) maxim=a%10;
if(minim>(a%10)) minim=a%10;
n++;
a=a/10;
}
}

int main()
{
int x,a=-1,b=-1,i,j,mn,mx;
while(f>>x)
{
if(x%2==0)
if(x>b)
{
if(x>a)
{ b=a;
a=x;
}
else b=x;
}}
g<<a<<" "<<b<<endl;
maxmin(a,x,mx,mn);
int m[10][10];
for(i=1;i<=x;i++)
for(j=1;j<=x;j++)
{if(i==j) m[i][j]=0;
else if(i<j) m[i][j]=mx;
else m[i][j]=mn;}
for(i=1;i<=x;i++)
{for(j=1;j<=x;j++) g<<m[i][j]<<" ";
g<<endl;}
f.close(); g.close();
return 0;
}
Problema 6
Fişierul text Numere.txt conţine pe prima linie un număr natural n (0&lt;n&lt;100000), iar pe a
doua linie n
numere naturale, formate din cel mult 4 cifre, separate prin câte un spaţiu.
a) Determinaţi în mod eficient, din punct de vedere al memoriei şi a timpului de executare,
cifrele ce apar în
scrierea numerelor situate pe a doua linie a fişierului. Programul va afişa în fişierul de ieşire
Rezultate.out
cifrele (în ordine crescătoare) precum şi numărul de apariţii al acestora (pe fiecare linie cifra şi
numărul
ei de apariţii separate de un singur spaţiu).
b) Verificaţi dacă suma cifrelor impare este un număr palindrom, şi afişaţi pe ecran un mesaj
corespunzător
(DA sau NU). Veţi utiliza un subprogram care primeşte ca parametru un număr natural x de cel
mult 4
cifre şi returnează inversul numărului x.
Exemplu: Dacă fişierul Numere.txt are următorul conţinut:
7
243 32 545 74 12 1344 90
Fişierul Rezultate.out va avea următorul conţinut:
01
12
23
33
45
52
71
91
Pe ecran se va afişa NU (deoarece suma cifrelor impare 2*1+3*3+2*5+1*7+1*9 = 37 care nu
este un număr
palindrom)
REZOLVARE
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("Numere.in");
ofstream g("Numere.out");

int palindrom(int x)
{int c; c=x;
int oglindit=0;
while(c){oglindit=oglindit*10+c%10;
c=c/10;}
return oglindit;}
int w[10];
int main()
{int n,x,s=0,i;
f>>n;
while(f>>x) {while(x) {w[x%10]++; x=x/10;}}
for(i=0;i<=9;i++)
if(w[i]!=0) {if(i%2==1) s=s+i*w[i];
g<<i<<" "<<w[i]<<endl;}
if(s==palindrom(s)) g<<"DA";
else g<<"NU";

f.close();
g.close();
return 0;
}
Subiectul 7
În fişierul Numere.txt pe prima linie sunt memorate două numere naturale n şi m (1&lt;n,
m&lt;51), iar pe
următoarele n linii câte m numere naturale distincte cu maxim 4 cifre fiecare, separate prin câte
un spaţiu. Se
cere:
a) Afişaţi pe prima linie a fişierului de ieşire Rezultat.out toate numerele din fişierul de intrare
care au cifra
de control pară. Numerele se vor afişa separate prin câte un spaţiu, în ordinea apariţiei lor în
fişierul de
intrare. Cifra de control a unui număr se obţine calculând suma cifrelor numărului, apoi suma
cifrelor
sumei şi tot asa până la obţinerea unei singure cifre. În cazul în care niciun număr nu are cifra
de control
pară în fişierul de ieşire se va afişa mesajul NU EXISTA. Veţi folosi un subprogram care
primeşte ca
parametru un număr natural x, cu cel mult 4 cifre şi returnează cifra de control a valorii reţinute
de x.
b) În cazul în care pe prima linie a fişierului de ieşire au fost afişate valori numerice, atunci să
afişeze pe a
doua linie a fişierului de ieşire cel mai mare număr natural format din cifrele distincte ale
numerelor de pe
prima linie a fişierului Rezultat.out. Alegeţi un algoritm de rezolvare eficient din punct de vedere
al
memoriei utilizate şi al timpului de executare. Dacă pe prima linia a fişierului de ieşire s-a afişat
NU
EXISTA, atunci pe a doua linie a fişierului de ieşire nu se va afişa nimic.
Exemplu: Dacă fişierul Numere.txt are următorul conţinut:
23
123 12 3
524 171 11
Fişierul Rezultat.out va avea următorul conţinut:
123 524 11
54321
REZOLVARE
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("Numere.txt");
ofstream g("Rezultate.out");
int cifcontrol (int x)
{int s;
do{s=0;
while(x)
{s=s+x%10; x=x/10;}
x=s;}while(s>9);
return s;}
int v[10];
int main()
{ int n,m,ok=0, i,x;
f>>n>>m;
while(n)
{for(i=1;i<=m;i++) {f>>x;
if(cifcontrol(x)%2==0)
{g<<x<<" "; ok=1;
while(x) {v[x%10]=1;
x=x/10;}}}
n--;}
if(ok==0) g<<"NU EXISTA";
else {g<<endl;
for(i=9;i>=0;i--) if(v[i]!=0) g<<i;}

f.close();
g.close();
return 0;
}
Subiectul 8
Fişierul text Matrice.txt conţine pe prima linie un număr natural n (0&lt;n&lt;=50), şi un număr
natural k
(0&lt;k&lt;=9), iar pe fiecare dintre următoarele n linii câte n numere naturale de cel mult 9 cifre,
separate prin
câte un spaţiu, numere care reprezintă elementele unei matrice pătratice de dimensiune n.
a) Construiţi un vector cu n elemente, fiecare element v i (i=1,2,...,n) al vectorului conţine
minimul dintre
elementele liniei i, care conţine exact k cifre de 1 în reprezentarea sa binară, sau valoarea zero
dacă nu
există un astfel de element pe linia i. Afişaţi elementele vectorului astfel construit, separate de
câte un
spaţiu pe prima linie în fişierul Rezultate.out.
Se va utiliza un subprogram cifunu care primeşte ca parametru un număr natural x, şi
returnează numărul
de cifre 1 din reprezentarea binară a numărului x.
b) Pe a doua linie a fişierului de ieşire Rezultate.out afişaţi cel mai mare număr obţinut din
cifrele
elementului maxim din vectorul format
Exemplu: Dacă fişierul Matrice.txt are următorul conţinut:
43
11 12 3 15
8 2 17 3
5 0 7 10
13 11 155 16
Fişierul Rezultate.out va avea următorul conţinut:
11 0 7 11
11
REZOLVARE
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("Numere.txt");
ofstream g("Rezultate.out");
int cif1(int x)
{int k=0;
while(x>0) {if(x%2==1) k++;
x=x/2;}
return k;}
int main()
{ int n,k,v[100],i,j,x,minim,maxim=-1,w[10]={0};
f>>n>>k;
for(i=1;i<=n;i++)
{minim=1000000000;
for(j=1;j<=n;j++) {f>>x;
if(cif1(x)==k) if(x<minim) minim=x;}
if(minim!=1000000000) v[i]=minim;
else v[i]=0;}
for(i=1;i<=n;i++) g<<v[i]<<" "; g<<endl;
for(i=1;i<=n;i++) if(v[i]>maxim) maxim=v[i];
while(maxim)
{w[maxim%10]++;
maxim=maxim/10;}
for(i=9;i>=0;i--) while(w[i]!=0) {g<<i;
w[i]--;}
f.close();
g.close();
return 0;
}
Subiectul 9
Fişierul Cuvant.in conţine cuvinte formate doar din litere mici, separate prin unul sau mai multe
spaţii
(numărul cuvintelor poate să difere de la un rând la altul; o linie din fişier conţine cel mult 255 de
caractere).
Definim randamentul unui cuvânt ca fiind numărul de caractere distincte din cuvânt/lungimea
cuvântului. De exemplu şirul ‘caractere’ are randamentul 5/9=0.56.
a) Afişaţi în fişierul Rezultate.out, pentru fiecare linie citită din fişierul de intrare cuvintele în
ordinea
apariţiei lor, precum şi randamentul fiecărui cuvânt. Veţi folosi un subprogram care primeşte ca
parametru un şir de caractere s returnează printr-un al doilea parametru numărul de caractere
distincte ale
lui s.
b) Pe ultimul rând în fişierul de ieşire afişaţi cuvântul cu randamentul cel mai mare. Dacă în
fişier există mai
multe astfel de cuvinte afişaţi-l pe ultimul.
Exemplu: Dacă fişierul Cuvânt .in are următorul conţinut:
caractere litere mici
problemele pentru concurs sunt grele
flori galbene
Fişierul Rezultate.out va avea următorul conţinut:
caractere 0.56 litere 0.83 mici 0.75
problemele 0.60 pentru 1.00 concurs 0.86 sunt 1.00 grele 0.80
flori 1.00 galbene 0.86
flori
REZOLVARE
#include <iostream>
#include <cstring>
#include <fstream>
#include <iomanip>
using namespace std;
ifstream f("Cuvant.in");
ofstream g("rezultate.out");

void nrcdis(char s[50],int &k)


{ int a[28]={0},i; k=0;
for(i=0;i<strlen(s);i++)
a[s[i]-'a']=1;
for(i=0;i<=28;i++)
if(a[i]==1) k++;
}

int main()
{ char s[255],*p,cuvmax[30];
int k,x; float r,rmax=0;
while(f.get(s,255))
{p=strtok(s," ");
while(p)
{nrcdis(p,k); r=(float)k/strlen(p);
if(r>=rmax) {rmax=r;
strcpy(cuvmax,p);}

x=r*100;
r=x/100.0; ///sau setprecision(2) la cout

g<<p<<" "<<r<<" ";


p=strtok(NULL," ");}
g<<endl;
f.get();}
g<<cuvmax;
f.close();
g.close();
return 0;}
Problema 10
Se citesc de la tastatură un număr natural nenul n, (n&lt;10) şi un număr natural k (k&lt;=9).
a) Construiţi un tablou pătratic a, unde a i j este al i+j-1 lea număr prim (dacă numerotăm indicii
matricei
1..n) sau al i+j+1 lea număr prim (dacă numerotăm indicii matricei 0..n-1). Afişaţi tabloul astfel
construit
în fişierul Matrice.out, pe primele n linii ale fişierului, elementele unei linii fiind separate de un
singur
spaţiu. Utilizaţi un subprogram prim, care primeşte ca şi parametru un număr natural x, şi
returnează
valoarea 1 dacă numărul transmis ca parametru este prim, şi 0 în caz contrar.
b) Afişaţi pe următoarea linie în fişierul de ieşire, în ordine crescătoare toate elementele
tabloului astfel
construit care au exact k cifre distincte. Dacă nu există astfel de numere în tabloul construit
afişaţi în
fişier mesajul NU EXISTĂ.
Exemplu: Dacă n=4 şi k=2
Fişierul Matrice.out va avea următorul conţinut:
2357
3 5 7 11
5 7 11 13
7 11 13 17
13 17
Obs. Pentru n=4 şi k=4 pe ultima linie din fişier se va afişa NU EXISTĂ. Considerăm că numărul
2 este
primul număr prim.
REZOLVARE
#include <iostream>
#include <fstream>
using namespace std;
ofstream g("Matrice.out");
int prim(int x)
{int d;
if(x<2) return 0;
if(x==2) return 1;
if(x%2==0) return 0;
d=3;
while(d*d<=x) {if(x%d==0) return 0;
d=d+2;}
return 1;}
int main()
{int x,i,j,a[10][10],n,k;
cin>>n>>k;
x=2;
for(j=1;j<=n;j++)
{while(prim(x)==0) x++;
a[1][j]=x; x++;}
for(i=2;i<=n;i++)
{for(j=1;j<=n-1;j++)
a[i][j]=a[i-1][j+1];
while(prim(x)==0) x++;
a[i][n]=x; x++;}
for(i=1;i<=n;i++)
{for(j=1;j<=n;j++) g<<a[i][j]<<" ";
g<<endl;}
for(j=1;j<=n;j++)
{int x,m=0,v[10]={0};
x=a[1][j];
while(x) {v[x%10]=1; x=x/10;}
for(i=0;i<=9;i++)
if(v[i]==1) m++;
if(m==k) g<<a[1][j]<<" ";}
for(i=1;i<=n;i++)
{int x,m=0,v[10]={0};
x=a[i][n];
while(x!=0) {v[x%10]=1; x=x/10;}
for(j=0;j<=9;j++) if(v[j]==1) m++;
if(m==k) g<<a[i][n]<<" ";}
g.close();
return 0;}
Subiectul 11
Fişierul Date.in conţine cel mult 10000 numere naturale cu cel mult 2 cifre fiecare, printre care
cel puţin un
număr par şi cel puţin un număr impar, separate prin câte un spaţiu. Numărul de numere din
fişier este
variabil de la o linie la alta.
a) Scrieţi un program care citeşte numerele din fişierul Date.in şi scrie în fişierul text Date.out
valorile
distincte citite, separate prin câte un spaţiu, respectându-se regula: pe prima linie vor fi scrise
numerele
impare distincte în ordine crescătoare, iar pe linia a doua numerele pare distincte, în ordine
descrescătoare. Alegeţi o metodă eficientă din punctul de vedere al timpului de executare.
b) Calculaţi suma numerelor pare distincte din fişierul de intrare şi eliminaţi din numărul obţinut
cifrele
impare. Veţi utiliza un subprogram care primeşte ca parametru un număr natural x de cel mult 8
cifre şi
returnează prin intermediul aceluiaşi parametru numărul obţinut după eliminarea cifrelor impare.
Rezultatul se va tipări pe a treia linie a fişierului de ieşire.
Exemplu: Dacă fişierul Date.in are următorul conţinut:
75 12 3
3 18
75 1 3 92
Fişierul Date.out va avea următorul conţinut:
1 3 75
92 18 12
22
deoarece suma numerelor pare este 122, iar după eliminarea cifrei 1 care e impară se obţine
22.
REZOLVARE
#include <iostream>
#include <fstream>
ofstream g("Date.out");
using namespace std;
void suma(int &x)
{
int y,p=1;
while(x)
{
if(x%2==0)
{
y=y+x%10*p;
x=x/10;
}
}
x=y;
}
int main()
{
int v[100]={0},x,s=0,i;
while(f>>x)
v[x]=1;
for(i=1;i<=99;i=i+2)
if(v[i]==1) g<<i<<" ";
g<<endl;
for(i=98;i>=2;i=i-2)
{
if(v[i]==1) g<<i<<" ";
s=s+i;
}
g<<endl;
suma(s);
g<<s;
f.close();
return 0;
}
Subiectul 12
În fişierul Cuvant.in pe prima linie este memorat un număr n (1&lt;n&lt;51) şi pe următoarele n
linii cuvinte
separate prin unul sau mai multe spaţii (numărul cuvintelor poate să difere de la un rând la altul;
o linie din
fişier conţine cel mult 255 caractere). Se cere:
a) Afişaţi în fişierul de ieşire Prefix.out pe fiecare linie toate prefixele celui mai lung cuvânt de pe
linia
corespunzătoare din fişierul Cuvant.in. Dacă sunt mai multe cuvinte de aceeaşi lungime se vor
scrie
prefixele ultimului cuvânt dintre cele care îndeplinesc condiţia. Prefixele unui cuvânt x sunt
reprezentate
de toate subşirurile şirului x (care încep cu primul caracter din x), de la cel de lungime 1 până la
cel de
lungimea şirului x–1. Veţi folosi un subprogram care primeşte ca parametru un şir de caractere
şi
determină afişarea în fişierul de ieşire a tuturor prefixelor acelui şir.
b) Pe ultima linie a fişierului de ieşire se vor afişa toate cuvintele din fişierul de intrare care
încep cu litera a
sau A. În cazul în care în fişierul de intrare nu există astfel de cuvinte, în fişierul de ieşire se va
afişa
mesajul NU EXISTA.
Exemplu: Dacă fişierul Cuvant.in are următorul conţinut:
3
Ana cascada lupta
feriga parada alama
rusine ard jucarie
REZOLVARE
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
fstream f("Cuvant.in");
ofstream g("Rezultate.out");
void prefixe(char s[25])
{int i;
char s1[25];
for(i=1; i<strlen(s); i++)
{
strncpy(s1,s,i);
s1[i]='\0';
g<<s1<<" "; }
g<<endl;}
int main()
{ char s[256],*p,cuvmax[25]=" ",v[500][25];
int n,m=0,i;
f>>n;
f.get();
while(f.get(s,255))
{ p=strtok(s," ");
strcpy(cuvmax,"");
while(p)
{
if(p[0]=='a'||p[0]=='A')
{ m++;
strcpy(v[m],p);
}
if(strlen(p)>=strlen(cuvmax)) strcpy(cuvmax,p);
p=strtok(NULL," "); }
prefixe(cuvmax);
f.get();}
if(m==0) g<<"NU EXISTA";
else
for(i=1;i<=m;i++)
g<<v[i]<<" ";

f.close();
g.close();
return 0;}
Problema 13

Fişierul text Numere.in conţine cel mult 1000 de numere naturale cu cel mult patru cifre fiecare,
despărţite
prin câte un spaţiu.
a) Scrieţi programul care citeşte numerele din fişierul Numere.in şi afişează în fişierul de ieşire
Rezultate.out, în ordine crescătoare, acele numerele din fişierul de intrare care au toate cifrele
egale.
Pentru a verifica dacă toate cifrele unui număr sunt egale veţi folosi un subprogram care
primeşte ca
parametru un număr natural x de cel mult patru cifre şi returnează numărul de cifre distincte ale
lui x.
Dacă fişierul nu conţine niciun astfel de număr, atunci se va scrie în fişierul de ieşire mesajul NU
EXISTA.
b) Dacă există astfel de numere afişaţi factorii primi împreună cu exponenţii lor, din
descompunerea în
factori primi ai celui mai mare număr care are toate cifrele egale. Afişarea se va face în fişierul
Rezultate.out, începând cu cea dea doua linie, fiecare factor şi exponentul său pe câte o linie în
fişier
separaţi de câte un spaţiu.
Exemplu: Dacă fişierul Numere.in are următorul conţinut:
30 11 444 7 25 5
Fişierul Rezultate.out va avea următorul conţinut:
5 7 11 444
22
31
37 1
Cel mai mare număr care are toate cifrele egale este 444 iar 444= 2 2 + 3 1 + 37 1
REZOLVARE

#include <iostream>
#include <fstream>
using namespace std;
ifstream f("Numere.in");
ofstream g("rezultate.out");
int cifre(int x)
{
int v[10]= {0},k=0,i;
while(x)
{
v[x%10]=1;
x=x/10;
}
for(i=0; i<=9; i++) if(v[i]==1) k++;
return k;
}
void descompunere (int x)
{
int d,exp;
d=2;
while(x>1)
{ exp=0;
while(x%d==0)
{x=x/d;
exp++; }
if(exp!=0) g<<endl<<d<<" "<<exp;
d++;}}
int main()
{int x,k=0,v[10000]= {0},i,m=0;
while(f>>x)
{ if(cifre(x)==1) {k=1; v[x]++;} if(m<x) m=x;}

if(k==0) g<<"Nu exista";


else {for(i=0;i<10000;i++)
while(v[i]!=0) {g<<i<<" "; v[i]--;}}
descompunere(m);
f.close();
g.close();
return 0;
}
Problema 14
O matrice pătratică A de dimensiune n cu p elemente nenule este memorată economic în
fişierul de intrare
Matrice.txt sub următoarea formă.: pe prima linie a fişierului se găsesc două numere n şi p,
dimensiunea
matricei respectiv numărul de elemente nenule, iar pe următoarele p linii triplete de numere
naturale (v, l, c)
care reprezintă valoarea, linia respectiv coloana pe care se găsesc elementele nenule.
a) Scrieţi un program care citeşte informaţiile din fişierul de intrare, reface şi scrie în fişierul de
ieşire
Matrice.out matricea A.
b) Verificaţi dacă suma elementelor nenule ale matricei este un număr perfect (un număr este
considerat
perfect dacă este egal cu suma tuturor divizorilor săi cu excepţia lui însuşi ex: 6 =1+2+3 ;
28=1+2+4+7+14 ) şi afişaţi pe ecran un mesaj corespunzător (DA sau NU). Pentru a verifica
daca un
număr este perfect veţi utiliza un subprogram care primeşte prin intermediul unui parametru un
număr
natural x şi returnează suma divizorilor săi, excepţie numărul.
Exemplu: Dacă fişierul Matrice.txt are următorul conţinut:
58
111
512
123
325
432
441
243
854
Fişierul Matrice.out va avea următorul conţinut:
15000
00103
04000
40200
00080
Pe ecran se va afişa DA (deoarece suma este 1+5+1+3+4+4+2+8=28 care este un număr
perfect)
REZOLVARE
#include <iostream>
#include <fstream>
using namespace std;
int a[10][10];
int perfect(int x)
{
int s=1,d;
if(x==1) return 0;
for(d=2;d<=x/2;d++)
if(x%s==0) s=s+d;
return s;
}
int main()
{
int n,p,v,l,c,s=0,i,j;
f>>n>>p;
for(i=1;i<=n;i++)
{
f>>v>>l>>c;
a[l][c]=v;
}
for(i=1;i<=n;i++)
{ for(j=1;j<=n;j++)
g<<a[i][j]<<" ";
g<<endl;}
if(perfect(s)==s) cout<<"DA";
else cout<<"NU";
return 0;
}
Problema 15
Fişierul text Numere.txt conţine pe prima linie un număr natural k (0&lt;k&lt;15) si pe
următoarele rânduri cel
mult 50.000 de numere naturale din intervalul închis [0, 99], numerele de pe acelaşi rând fiind
separate prin
câte un spaţiu.
a) Scrieţi un program care afişează în fişierul de ieşire Numere.out, în ordine crescătoare,
separate de cate
un spaţiu, acele numere din fişierul Numere.txt care au cel puţin k divizori proprii. Utilizaţi un
algoritm
eficient din punct de vedere al timpului de executare. Dacă un număr care corespunde cerinţei
apare de
mai multe ori, se va afişa o singură dată.
b) Verificaţi dacă cifrele ultimului număr scris în fişierul de ieşire Numere.out au aceeaşi paritate
(toate pare
sau toate impare), şi afişaţi pe ecran un mesaj corespunzător (DA sau NU). Veţi folosi un
subprogram
care primeşte prin intermediul unui parametru un număr natural n din intervalul
[0, 99] şi returnează atât numărul de cifre pare cât şi numărul de cifre impare ale numărului n.
Exemplu: dacă fişierul Numere.txt are următorul conţinut:
4
15 36 33
36 1 12 1 24
2
Fişierul Numere.out va avea următorul conţinut:
12 24 36
Pe ecran se va afişa NU (deoarece 3 şi 6 nu sunt de aceeaşi paritate)
REZOLVARE
#include <iostream>
#include <fstream>
using namespace std;
void paritate(int n,int &p,int &i)
{
i=0,p=0;
while(n)
{
if(n%2==0)
p++;
else i++;
n=n/10;
}
}
int divizor(int n)
{
int d=2,i;
for(i=2;i<=n/2;i++)
if(n%d==0)
d++;
return d;
}
int main()
{
int x,n,u,i,v[100]={0},k;
f>>k;
while(f>>x)
{
if(divizor(x)>=k)
{
v[x]=1;
u=x;
}
}
for(i=1;i<=99;i++)
{
if(v[i]==1)
g<<i<<" ";
}
paritate(u,x,n);
if(x==0||n==0) cout<<u;
return 0;
}

Problema 16
În fişierul Cuvant.txt pe prima linie sunt memorate două numere p (1&lt;p&lt;51) şi n
(1&lt;n&lt;101), pe a doua linie
un cuvânt cuv şi pe următoarele n linii cuvinte separate prin unul sau mai multe spaţii (numărul
cuvintelor
poate să difere de la un rând la altul; o linie din fişier conţine cel mult 255 caractere). Se cere:
a) Afişaţi în fişierul de ieşire Rime.txt pe fiecare linie toate cuvintele de pe linia corespunzătoare
din fişierul
de intrare care sunt rime cu cuvântul cuv (două cuvinte sunt rime dacă ultimele p caractere
coincid).
Cuvintele de pe aceeaşi linie se vor afişa separate prin câte un spaţiu. Dacă pe o linie nu există
niciun
cuvânt care să îndeplinească condiţia, atunci pe linia corespunzătoare în fişierul Rime.txt se va
afişa
mesajul NU EXISTA. Veţi folosi un subprogram care primeşte ca parametri două şiruri de
caractere şi un
număr natural p. Subprogramul va returna valoarea 1, dacă cele două şiruri de caractere sunt
rime (au
ultimele p caractere identice) sau valoarea 0 în caz contrar.
b) Pe ultima linie a fişierului de ieşire se va afişa numărul cuvintelor din fişierul de intrare care
încep cu
majusculă (nu se va număra cuvântul de pe a doua linie a fişierului de intrare).
Exemplu: Dacă fişierul Cuvant.txt are următorul conţinut:
24
ferit
Sarit cascada indraznit
feriga fugit alama
rusine Ranit Jucarie
Albastru
Fişierul Rime.txt va avea următorul conţinut:
Sarit indraznit
fugit
Ranit
NU EXISTA
4

REZOLVARE
#include <iostream>
#include <cstring>
#include <fstream>
#include <iomanip>
using namespace std;
ifstream f("Cuvant.in");
ofstream g("rezultate.out");

int rime(char c1[51],char c2[51], int p)


{char s1[51],s2[51];
if(strlen(c1)<p||strlen(c2)<p) return 0;
strcpy(s1,c1+strlen(c1)-p);
strcpy(s2,c2+strlen(c2)-p);
if(strcmp(s1,s2)==0) return 1;
return 0;}

int main()
{
int n,p,ok=0,k=0,i;
char cuv[51],s[256],*t;
f>>p>>n; f>>cuv;
for(i=1;i<=n;i++)
{f.get(); f.get(s,255); ok=0;
t=strtok(s," ");
while(t)
{if(t[0]>='A'&&t[0]<='Z') k++;
if(rime(t,cuv,p)==1)
{ok=1; g<<t<<" ";}
t=strtok(NULL," ");}
if(ok==0) g<<"NU EXISTA";
g<<endl;}
g<<k;

f.close();
g.close();
return 0;
}

Problema 17
Fişierul atestat.in conţine un text format din cel mult 250 de caractere, scris pe o singură linie.
Cuvintele din
text sunt separate prin câte un spaţiu, iar fiecare cuvânt este format din cel mult 20 caractere
literele mici ale
alfabetului englez.
a) Să se scrie în fişierul atestat.out textul în care fiecare cuvânt care conţine cel puţin o
consoană să fie
înlocuit de inversul său. Se va utiliza un subprogram s1 care primeşte prin intermediul singurului
său
parametru s un cuvânt şi returnează numărul de consoane din cuvântul s.
b) Pe a doua linie în fişierul atestat.out să se scrie cuvântul de lungime maximă şi lungimea lui.
Dacă sunt
mai multe astfel de cuvinte, se va afişa primul găsit.
Exemplu: Dacă fişierul atestat.in are următorul conţinut:
fetita ia o ie si o da elenei
Fişierul atestat.out va avea următorul conţinut:
atitef ia o ie is o ad ienele
fetita 6
REZOLVARE
#include <iostream>
#include <cstring>
#include <fstream>
#include <iomanip>
using namespace std;
ifstream f("Cuvant.in");
ofstream g("rezultate.out");

int s1(char s[21])


{int i,k=0;
for(i=0;i<strlen(s);i++)
if(strchr("aeiou",s[i])==0) k++;
return k;}
void invers(char s[21])
{int i,j; char x;
i=0; j=strlen(s)-1;
while(i<j) {x=s[i]; s[i]=s[j]; s[j]=x; i++; j--;}}

int main()
{ char cuvmax[21]="",s[251],*p;
f.get(s,251);
p=strtok(s," ");
while(p)
{if(strlen(p)>strlen(cuvmax))
strcpy(cuvmax,p);
if(s1(p)>0) invers(p);
g<<p<<" "; p=strtok(NULL," ");}
g<<endl; g<<cuvmax<<" "<<strlen(cuvmax);
f.close();
g.close();
return 0;
}
Subiectul 18
Se citesc de la tastatură două numere naturale n (1≤n≤10) şi k (0&lt;k&lt;=10).
a) Construiţi în memorie o matrice cu n linii şi n coloane, astfel încât parcurgând liniile matricei
de sus în
jos şi de la stânga la dreapta se obţin, în prima linie primele n numere ale şirului Fibonacci în
ordine
crescătoare, în linia a doua următoarele n numere ale şirului Fibonacci în ordine
descrescătoare, în linia
a treia următoarele n numere ale acestui şir în ordine crescătoare, şi aşa mai departe, ca în
exemplu.
Elementele şirului Fibonacci se obţin astfel: primul element este 0, al doilea este 1, iar
elementele
următoare se obţin însumând cele două elemente care preced elementul curent. Astfel, primele
16
elemente ale acestui şir sunt: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610.
Programul afişează
in fişierul Matrice.out matricea obţinută, câte o linie a matricei pe câte o linie a fişierului,
elementele
fiecărei linii fiind separate prin câte un spaţiu.
b) Pe următoarea linie în fişier afişaţi produsul indicilor coloanelor pe care există cel puţin k
elemente pare.
Exemplu: Dacă se citesc de la tastatură n=4 şi k=2
Fişierul Matrice.out va avea următorul conţinut:
0112
13 8 5 3
21 34 55 89
610 377 233 144
8
Pe ultima linie in fişier se va afişa 8 (deoarece coloanele 1, 2 şi 4 conţin cel puţin două elemente
pare).
REZOLVARE

#include <iostream>
#include <fstream>
using namespace std;
ofstream g("Matrice.out");
int main()
{
int n,tap,tp,t,i,k,j,a[100][100];
cin>>n>>k;

a[1][1]=0;
a[1][2]=1;

for(j=3;j<=n;j++)
a[1][j]=a[1][j-1]+a[1][j-2];
tap=a[1][n-1];
tp=a[1][n];
t=tap+tp;
for(i=2; i<=n; i++)
{
if(i%2!=0)
for(j=1; j<=n; j++)
{
a[i][j]=t;
tap=tp;
tp=t;
t=tap+tp;
}
else for(j=n; j>=1; j--)
{
a[i][j]=t;
tap=tp;
tp=t;
t=tap+tp;
}
}
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
g<<a[i][j]<<' ';
g<<endl;
}
int p=1;
for(j=1; j<=n; j++)
{
t=0;
for(i=1; i<=n; i++)
{
if(a[i][j]%2==0)t++;}
if(t>=k)p=p*j;

}
g<<p;
g.close();
return 0;
}
Problema 19
Un şir de caractere s se numeşte “şablon” pentru un alt şir de caractere x, dacă este format din
caractere din
mulţimea {*, ?, #}, are aceeaşi lungime cu x şi pe fiecare poziţie din s în care apare * în x se
găseşte o
vocală, pe fiecare poziţie din s în care apare # în x se găseşte o consoană şi pe fiecare poziţie
din s în care
apare ? putem avea orice caracter în x. Se consideră vocală orice literă din mulţimea {a, e, i, o,
u}.
a) Se citesc din fişierul Cuvinte.in două şiruri de caractere, de aceeaşi lungime, formate din cel
mult 200 de
litere mici ale alfabetului englez. Şirurile se găsesc în fişer fiecare pe câte o linie. Afişaţi pe
ecran, un
şablon comun celor două şiruri citite, care conţine un număr minim de caractere ?.
b) Verificaţi dacă unul din cuvintele citite este anagrama celuilalt şi afişaţi pe ecran mesajul DA
în caz
afirmativ sau NU în caz contrar.
Exemplu: Dacă fişierul Cuvinte.in are următorul conţinut:
diamant
pierdut
Pe ecran se va afişa:
#**#??#
NU
REZOLVARE
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
fstream f("Matrice.in");
int anagrama (char s1[201], char s2[201])
{int v[256]={0},i;
for(i=0;i<strlen(s1);i++)
{v[s1[i]]++;
v[s2[i]]--;}
for(i=0;i<=255;i++) if(v[i]!=0) return 0;
return 1;}

int main()
{ char s1[201], s2[201], s[201];
int i;
f>>s1>>s2;
for(i=0;i<strlen(s1);i++)
{if(strchr("aeiou", s1[i])!=0&&strchr("aeiou", s2[i])!=0)
s[i]='*';
else if(strchr("aeiou", s1[i])==0&&strchr("aeiou", s2[i])==0)
s[i]='#';
else s[i]='?';}
s[strlen(s)]='\0';
cout<<s<<endl;
if(anagrama(s1,s2)==1) cout<<"DA";
else cout<<"NU";
f.close();
return 0;}
Subiectul 20
Se consideră un arbore cu rădăcină şi n vârfuri (n din N, 2&lt;n&lt;100), dat prin vectorul
de taţi. Vârfurile sunt
etichetate cu numere consecutive şi distincte: 1, 2, 3, .. , n. Fişierul atestat.in conţine 2
linii. Pe prima linie a
fişierului este scris numărul n, reprezentând numărul de vârfuri, iar pe a doua linie sunt
scrise n numere,
separate prin spatiu, reprezentând valorile consecutive ale vectorului de
&quot;taţi&quot;.
a) Să se scrie pe prima linie în fişierul atestat.out etichetele tuturor frunzelor arborelui.
b) Pe următoarele linii ale fişierului atestat.out să se scrie fiecare nod neterminal
împreună cu numărul
descendenţilor direcţi (câte un nod cu numărul fiilor săi pe câte un rând). Se va utiliza
un subprogram
fii cu trei parametrii n (numărul de vârfuri), t (vectorul de taţi) şi k (eticheta unui vârf).
Subprogramul
returnează numărul tuturor descendenţilor direcţi ai vârfului cu eticheta k.
Exemplu: Dacă fişierul atestat.in are următorul conţinut:
10
0112322665
Fişierul atestat.out va avea următorul conţinut:
4 7 8 9 10
12
23
31
51
62
REZOLVARE
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("atestat.in");
ofstream g("atestat.out");
int fii(int n, int t[100], int k)
{int i,ok=0;
for(i=1;i<=n;i++)
if(t[i]==k) ok++;
return ok;}

int main()
{ int n,t[100], i,ok=0,j;
f>>n;
for(i=1;i<=n;i++) f>>t[i];
for(i=1;i<=n;i++) {ok=0;
for(j=1;j<=n;j++)
if(t[j]==i) ok=1;
if(ok==0) g<<i<<" ";}
for(i=1;i<=n;i++) {j=fii(n,t,i);
if(j!=0) g<<i<<" "<<j<<endl;}
f.close();
g.close();
return 0;}

S-ar putea să vă placă și