Sunteți pe pagina 1din 39

Nr.

5
Din fiierul de intrare date5.in se citesc de pe prima linie n,m,o,p,k , 5 numere naturale, apoi de pe a doua
linie, un ir de n numere naturale de maxim 9 cifre, de pe a treia linie un ir de m numere naturale de maxim 9
cifre, iar de pe a patra linie un ir de o numere naturale de maxim 9 cifre. (n[10,100]; m[10,100]; o[10,100];
p,k maxim 2 cifre) S se afieze att pe ecran, ct i n fiierul date5.out urmtoarele cerine:

I. Probleme de 4p (4p*5=20p)
I.1.
I.2.
I.3.
I.4.
I.5.

Suma numerelor din al doilea ir ce au ultima cifra mai mare ca prima cifr;
Produsul numerelor din al doilea ir, numere ce sunt mai mari dect ultima valoare a irului;
Produsul numerelor din al treilea ir, numere au exact 1 divizor propriu;
Care dintre irurile 2 sau 3 are suma elementelor impare i prime cea mai mica;
Suma numerelor pare divizibile cu k din primul ir;

II. Probleme de 5p (5p*4=20p)


II.1. S se afieze cel mai mic numr neprim din primul ir i de cte ori apare n irul respectiv. n cazul n care
n ir nu exist astfel de numere se va afia mesajul : In sirul 1 exist doar numere prime .
II.2. S se afieze cel mai mare numr impar din al doilea ir i poziiile pe care cesta apare n irul respectiv. n
cazul n care irul nu are numere impare se va afia mesajul : In sirul 2 nu exist numere impare .
II.3. S se afieze cel mai mare numr din al treilea ir, numr care are ultima cifr egal cu penultima;
II.4. S se afieze numrul din al treilea ir, care are cea mai mare sum a cifrelor.

III. Probleme de 6p (6p*5=30p)


III.1. S se tearg din al doilea ir elementele neprime ;
III.2. S se tearg din primul ir toate numerele care nu au suma cifrelor divizibil cu k.
III.3. S se insereze pe o poziie citit de la tastatur, valoarea 3, n cel de-al treilea ir.
III.4. S se insereze n primul ir , dup fiecare numar neprim, valoarea 5.
III.5. S se insereze n cel de-al doilea ir , dup poziia 3 valoarea maxim a irului.

Observaie :
Dup fiecare tergere sau inserare, se va afia irul rmas.
IV. Probleme de 10 ( oricare 3 sau chiar toate)
IV.1. S se afieze cea mai lung secven din al treilea ir, secven ce respect urmtoarele: numerele se
gsesc pe poziii consecutiv i sunt pare.
IV.2. S se afieze pentru cel de-al doilea ir , elementele ordonate descresctor .
IV.3. S construiasc un nou vector care s cuprind pentru fiecare element , produsul cifrelor din primul ir,
adic: z[i]=prod(a[i]);Apoi s se afieze vectorul construit.
IV.4. S se ordoneze crescresctor dup ultima cifr, toate elementele din primul ir. Apoi s se afieze irul
astfel obinut.

#include <cstdlib>
#include <iostream>
using namespace std;
int triangle(int num);
int main(int argc,char* argv[]){
int n;
cout<<"ENTER A NUMBER AND PRESS ENTER: ";
cin>>n;
cout<<"FUNCTION RETURNED"<<triangle(n);
system ("PAUSE");
return EXIT_SUCCESS;
}
//TRIANGLE NUMBER FUNCTION.
//RETURN 1+2+....+n
int triangle(int n) {
int i;
int sum=0;
for (i=1;i<=n;i++)
sum=sum+i;
return sum;
}

http://www.cplusplus.com/doc/tutorial/

http://www.learncpp.com/

Pentru itemul 1, scriei pe foaia de examen litera corespunztoare rspunsului corect.


1. Indicai expresia care are valoarea true/1 dac i numai dac numrul real memorat n variabila x se afl n intervalul [5,5].(4p.)

Limbajul Pascal

Limbajul C/C++

a.

x*x-25<0

x*x-25<0

b.

25-x*x>=0

25-x*x>=0

c.

(5<=x)and(x<=-5)

(5<=x)&&(x<=-5)

d.

(x-5)*(x+5)>=0

(x-5)*(x+5)>=0

2. Se consider algoritmul urmtor reprezentat n pseudocod:


S-a notat cu x%y restul mpririi numrului ntreg x la numrul ntreg nenul y i cu [a] partea ntreag a numrului real a.
citete n (numr natural)
z<-0; p<-1
ct timp n>0 execut
c<-n%10
n<-[n/10]
dac c%2=0 atunci
z<-z+p*(c+1)
p<-p*10

scrie z
a)

Ce valoare va fi afiat dac se citete valoarea 1092744? (6p.)

b)

Scriei toate numere naturale, distincte, fiecare avnd exact dou cifre, care pot fi citite pentru variabila n astfel nct s
se afieze valoarea 7.(4p.)

c)

Scriei n pseudocod un algoritm, echivalent cu cel dat, n care s se nlocuiasc structura ct timp...execut cu
o structur repetitiv de alt tip.(6p.)

d)

Scriei programul Pascal/C/C++ corespunztor algoritmului dat. (10p.)

Pentru itemii 1 i 2, scriei pe foaia de examen litera corespunztoare rspunsului corect.


1.

Stabilii care dintre urmtoarele grafuri cu 6 noduri, numerotate de la 1la6,date prin listele de adiacen reprezint un
graf neorientat conex, eulerian, dar care NU este hamiltonian. (4p.)
a. 1:2,4;

b. 1:2,3;

c. 1:2,3

d. 1:2,6;

2:1,3;
3:2,4,
5,6;
4:1,3;
5:3,6;
6:3,5;

2.

2:1,3;
3:1,2;
4:5;
5:4,6:
6:5:

;
2:1,3
;
3:1,2
;
4:;
5:6
6:5

2:1,3;
3:2,4;
4:3,5;
5:4,6;
6:1,5;

Cte grafuri orientate, distincte, cu 5 vrfuri se pot construi? Dou grafuri se consider distincte dac matricele lor de
adiacen sunt diferite.(4p.)
a. 5

b. 120

c. 210

d. 410

Scriei pe foaia de examen rspunsul pentru fiecare dintre cerinele urmtoare.


3.

4.

n declararea urmtoare, cmpurile x i y ale nregistrrii pot memora coordonatele carteziene ale unui punct din planul xOy.
Scriei o expresie n limbajul Pascal | C/C++ care s aib valoarea true|1 dac i numai dac punctele memorate n
variabilele A i B sunt situate la egal distan fa de originea axelor de coordonate, O. (6p.)
Limbajul Pascal

Limbajul C/C++

type punct=record
x,y:real
end;
var A,B:punct;

struct punct
{
float x,y;
} A,B;

Prin nlimea unui arbore cu rdcin nelegem numrul de muchii ale celui mai lung lan format din noduri distincte care
are una dintre extremiti n rdcina arborelui.
Scriei care este rdcina i care este nlimea arborelui descris prin urmtorul vector "de tai": (0,1,1,1,4,4,6,7).
(6p.)

5.

S se construiasc o matrice cu n linii i m coloane care conine pe prima coloan, de sus n jos, toate numerele naturale de
la 1 la n, n ordine cresctoare, pe coloana a doua, de sus n jos, toate numerele naturale de la 2 la n+1, n ordine
cresctoare, pe a treia coloan, de sus n jos, toate numerele naturale de la 3 la n+2, n ordine cresctoare, pe a patra
coloan, de sus n jos, toate numerele naturale de la 4 la n+3, n ordine cresctoare i aa mai departe pn la coloana m.
Scriei programul care citete de la tastatur dou valori naturale n i m (2<n<25, 2<m<25), construiete matricea conform
cerinei i o afieaz pe ecran, pe linii, cu spaii ntre elementele de pe fiecare linie.
De exemplu, dac se citete de la tastatur n=3 i m=5, se va construi i se va afia pe ecran matricea:
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
(10p.)

VARIANTA 1 - SUBIECTUL 3 (30p)

ru itemul 1, scriei pe foaia de examen litera corespunztoare rspunsului corect.


Utiliznd

metoda

backtracking

se

genereaz

ordine

cresctoare

toate

numerele

naturale

de

cte

patru

cifre

mulimea A={1,2,3,4,5}, numere care nu conin pe poziii alturate cifre din mulimea {1,5}.Primele opt numere generate sunt
ordine: 1212, 1213, 1214, 1221,1222, 1223, 1224, 1225. Cte dintre numerele generate ncep cu cifra 2 i se termin cu cifra 5? (4p.
a. 9

b. 12

c. 15

d. 19

ei pe foaia de examen rspunsul pentru fiecare dintre cerinele urmtoare.


Se consider subprogramul ex cu definiia urmtoare:

bajul Pascal

Limbajul C/C++

cedure ex( x:longint);


in
if x>3 then begin
write(x mod 10);
ex(x div 10)
end
else write('*')
;

void ex(int x)
{ if(x>3) {
printf("%d",x%10);
/ cout<<x%10;
ex(x/10);
}
else printf("*");
/ cout<<"*";
}

criei ce se va afia n urma apelului ex(25436). (3p.)

criei toate valorile numere naturale pe care le poate avea o variabil n, astfel nct pentru apelul ex(n) s se afieze doar caracterul *. (3p

Scriei definiia complet a unui subprogram sub, cu patru parametri, care primete prin intermediul parametrilor:
a i b, dou cifre distincte (a<10, b<10, ab);
n, un numr natural nenul (0 < n < 100);
v, un tablou unidimensional care memoreaz un ir de n numere naturale, fiecare avnd cel mult nou cifre.
Subprogramul sub determin modificarea irului de numere primit prin parametrul v realiznd eliminarea tuturor numerelor care coni
scrierea lor cel puin o cifr a i nu conin nicio cifr b. De asemenea subprogramul va furniza prin intermediul parametrului n numru
numere din irul modificat, iar prin parametrul v tabloul modificat. Dac n irul primit nu exist niciun numr care s conin n scrierea
cifraa i s nu conin cifra b, atunci valorile parametrilor n i v nu se vor modifica.

Exemplu. Pentru valorile n=10, v=(3551, 149, 3798, 502, 75, 2515, 51, 151, 489, 653), a=5i b=2 ale parametrilor, n urma apel
subprogramului subva furniza prin parametrii indicai valorile n=5 i v=(149, 3798, 502, 2515, 489).
(10p.)

Fiierul text bac.in conine un ir s de cel mult un milion de naturale nenule, formate fiecare din cel mult 9 cifre, separate prin cte
spaiu.
a) Scriei un program care, utiliznd un algoritm eficient din punct de vedere al timpului de executare i al spaiului de memorie util
determin i afieaz pe ecran lungimea maxim a unei secvene din ir format doar din numere pare. O secven a unui ir const
elemente aflate pe poziii consecutive n irul considerat. (8p.)
Exemplu: dac fiierul bac.in are coninutul:
12 6 245 18 8 2 36 39 34 8 36 11 10 12 102 24 881
atunci, pe ecran se va afia numrul 4 reprezentnd lungimea maxim a unei secvene format doar din numere pare din irul dat.
b) Descriei n limbaj natural metoda utilizat i explicai n ce const eficiena ei. (2p.)

Salt la pagina
6

VARIANTA 1 - SUBIECTUL 1 - REZOLVARE (30p)


25-x*x>=0 <> x*x-25<=0 <> (x-5)*(x+5)<=0 <> x[-5,5].
Pentru precizarea rspunsului b) se acord 4p.
Din numrul citit sunt eliminate toate cifrele impare iar fiecare cifr par din numr este mrit cu 1.
Pentru precizarea valorii 1355 se acord 6p.

Valoarea 7 poate fi obinut din numere citite pentru n de forma 6x sau x6 cu x{1,3,5,7,9} cifr impar. Algoritmul va afia valoare
dac se citete pentru n orice valoare din mulimea {16, 36, 56, 76, 96, 61, 63, 65, 67, 69}.

Pentru precizarea valorilor 16,36,56,76,96,61,63,65,67,69 se acord 4p. Pentru identificarea valorilor corecte cu aduga
sau repetarea unora dintre valori se acord 3p. Pentru identificarea a cel puin 5 valori corecte se acord 2p., iar pentru identificare
cel puin dou valori corecte se acord 1p. n celelalte cazuri se acord 0p.
nlocuirea structurii ct
repet - pn cnd:

timp

n>0 execut... presupune utilizarea unei structuri repetitive repet

ct

timp

Fr testarea iniial a valorii lui n (n>0), algoritmul obinut prin nlocuirea mecanic a structurii ct_timp cu structura repet... va a
pentru n=0 valoarea 1 spre deosebire de algoritmul din enun care afieaz valoarea 0 pentru n=0, deci cei doi algoritmi nu s
echivaleni.
Pentru alegerea unei structuri repetitive se acord 2p., pentru testarea iniial a valorii lui n se acord 2p., pentru testarea condiie
continuare sau oprire se acord 1p, iar pentru scrierea integral a restului algoritmului se mai acord 1p. - n total 6p.

Se testeaz capacitatea de a reprezenta pe hrtie algoritmul dat cu ajutorul unui limbaj de programare studiat. De i scrie
programelor pe hrtie este o activitate improprie la informatic, prin aceast cerin se valorific experienele anterioare
implementare i testare a programelor pe calculator, privind structura programelor, declararea variabilelor, sintaxa instruciun
programului, regulile de scriere a expresiilor, etc.

Pentru instruciunile corecte de declarare a variabilelor, de citire a datelor, de afiare a rezultatului i de decizie se acord cte
pentru instruciunea repetitiv se acord 3p., iar pentru cele 6 atribuiri se acord 2p. Pentru structura corect a programului se mai aco
1p., n total 10p.

VARIANTA 3 - SUBIECTUL 1 (30p)


Pentru itemul 1, scriei pe foaia de examen litera corespunztoare rspunsului corect.
1. Indicai expresia care are valoarea true/1 dac i numai dac numrul ntreg memorat n variabila x are exac trei cifre. (4p.)
Limbajul Pascal

Limbajul C/C++

a.

x<1000

x<1000

b.

(100<=x) and (x<=999)

(100<=x) && (x<=999)

c.

(-999<=x)and(x<=999)

(-999<=x)&&(x<=999)

d.

(-999<=x)and(x<=-100) or (100<=x)and(x<=999)

(-999<=x)&&(x<=-100) || (100<=x)&&(x<=999)

2. Se consider algoritmul urmtor reprezentat n pseudocod:


S-a notat cu x%y restul mpririi numrului ntreg x la numrul ntreg nenul y i cu [a] partea ntreag a numrului real a.

a)

Scriei ce se va afia dac se citesc, n aceast ordine, numerele:


12 23 34 592 13 39 91 1 0? (6p.)

b)

Scriei un set de date de intrare pentru care algoritmul, n urma executrii, va afia valoarea 1234. (4p.)

c)

Scriei n pseudocod un algoritm, echivalent cu cel dat, n care s se nlocuiasc structura ct timp t>9 execut... cu o
structur repetitiv de alt tip. (6p.)

d)

Scriei programul Pascal/C/C++ corespunztor algoritmului dat. (10p.)

VARIANTA 3 - REZOLVARE - SUBIECTUL 1 (30p)


Valoarea variabilei x trebuie s satisfac condiia 100<=|x|<=999.
Pentru precizarea rspunsului d) se acord 4p.
a)

irul de date de intrare (fr valoarea 0 utilizat pentru ncheierea opera iei de citire) se mparte n secvene formate din numere
proprietatea c prima cifr a numrului curent este egal cu cifra unitilor numrului precedent, iar cifra unitilor numrului cu
este egal cu prima cifr a numrului urmtor. Astfel irul de date de intrare se imparte n trei secvene de acest tip cu lungimile 3,
12 23 34 592 13 39 91 1 0

Pentru precizarea valorii 314 se acord 6p.


b)

Un
rspuns
posibil
poate
fi
setul
de
date
Pentru orice set de date de intrare corect se acord 4p.

c)

nlocuirea structurii ct timp t>0 execut


timp saurepet - pn cnd :

de

... presupune

intrare:

utilizarea

2
unei

structuri

repetitive repet

Pentru alegerea unei structuri repetitive se acord 2p., pentru testarea condiiei de continuare sau oprire se acord 2p, iar pe
scrierea integral a restului algoritmului se mai acord 2p. - n total 6p.
d)

Se testeaz capacitatea de a reprezenta pe hrtie algoritmul dat cu ajutorul unui limbaj de programare studiat. Dei scrie
programelor pe hrtie este o activitate improprie la informatic, prin aceast cerin se valorific experienele anterioare
implementare i testare a programelor pe calculator, privind structura programelor, declararea variabilelor, sintaxa instruciun
programului, regulile de scriere a expresiilor, etc.

Pentru instruciunile corecte de declarare a variabilelor, de citire a datelor, de afiare a rezultatului se acord cte 1p, pe
instruciunea de decizie decizie se acord 1p., pentru instruciunea repetitiv se acord 3p., iar pentru cele 6 atribuiri se acord
Pentru structura corect a programului se mai acord 1p., n total 10p.

VARIANTA 1 - SUBIECTUL 2 - REZOLVARE (30p)


Pentru precizarea rspunsului a) se acord 4p.

b)

a)
Graf conex eulerian care nu este hamiltonian

Graf neconex

c)
Graf neconex

d)
Graf conex eulerian i hamiltonian

Fiecrui graf i corespunde o funcie


care asociaz perechii de vrfuri distincte (i,j) valoarea:
0 dac nu exist arc de la i la j
1 dac exist arc de la i la j
2 dac exist arc de la j la i
3 dac exist arc de la i la j i exist arc de la j la i.
Numrul grafurilor cu cte n vrfuri este egal cu numrul acestor funcii, adic
Pentru rspunsul d) se acord 4p.
Un rspuns corect:

Pentru orice rspuns corect se acord 6p.


Rdcina arborelui este nodul x cu
proprietatea c tata[x]=0 -> rdcina
este nodul 1.
Cel mai lung lan elementar din
arbore cu o extremitate n rdcin
este este [1,4,6,7,8] i are lungimea
4. Astfel nlime arborelui este 4.
Se acord punctaje pariale astfel:
- 3p pentru indicarea corect a
rdcinii
- 3p pentru valoarea 4
corespunztoare nlimii arborelui
n total 6p.

Pot fi concepute mai multe metode de obinere a matricei cerute. Metoda clasic ce completeaz coloanele matricei (numerotate
la 1 lam), respectiv liniile (numerotate de la 1 la n), n maniera descris, este:

Pentru declararea corect a matricei se acord 1p., pentru citirea lui n i m se mai acord 1p., pentru parcurgerea unei coloane sau lini
acord 1p., pentru completarea corect a unei coloane se acord 2p., pentru completarea corect a tuturor coloanelor se acord 2p.,
pentru afiarea matricei conform cerinei se acord 2p. n plus, pentru declararea variabilelor simple, structura i corectitudinea sintactic
programului se mai acord 1p. - n total 10p.

VARIANTA 1 - SUBIECTUL 3 - REZOLVARE (30p)

Numerele cerute sunt: 2125; 2135; 2145; 2225; 2235; 2245; 2325; 2335; 2345; 2425;2435; 2445; 2525; 25
2545. Sunt generate 15 numere cu proprietatea din enun.
Pentru rspunsul c) se acord 4p.

n desenul urmtor este prezentat mecanismul prin care se execut apelul ex(25436) al subprogramului recursiv ex. Se vor afia
ordine: 6345*, rspuns pentru care se acord 3p.

Se observ c la n urma executrii apelurilor ex(0), ex(1), ex(2) i ex(3) se va afia de fiecare dat caracterul *.
Pentru rspunsul 0,1,2,3 se acord 3p.

Prelucrarea oferit de subprogram verific existena celor dou cifre n scrierea fiecrui numr memorat n tablou. tergerea u
element care conine cifra a i nu conine cifra b se realizeaz prin deplasarea cu o poziie la stnga a tuturor elementelor situat
dreapta celui ce urmeaz a fi ters. Dup realizarea deplasrii, se micoreaz valoarea lui n cu 1.

Limbajul Pascal

Limbajul C/C++

Type vector=array[1..100]of longint;


procedure sub(a:longint; b:byte;
var n:byte; var v:vector);
var exa,exb:boolean;
uc,i,j:byte;
z:longint;
begin
i:=1;
while i<=n do begin
exa:=false; exb:=false; z:=v[i];
while z>0 do
begin
uc:=z mod 10;
z:=z div 10;
if uc=a then exa:=true
else if uc=b
then exb:=true;
end;
if exa=true and exb=false then
begin
for j:=i+1 to n do v[j1]:=v[j];
n:=n-1
end
else inc(i);
end
end;

void sub(int a, int b, int &n, int v[])


{
int i=1,uc,exa,exb,z,j;
while(i<=n)
{
exa=0; exb=0; z=v[i];
while(z>0)
{
uc=z%10;
z=z/10;
if (uc==a) exa=1;
else if(uc==b) exb=1;
}
if (exa && !exb)
{
for(j=i+1;j<=n;j++)
v[j-1]=v[j];
n--;
}
else i++;
}
}

Pentru antet corect se acord 3p. (Pentru respectarea structurii antetului (procedure/void) se acord 1p., pentru declararea corec
parametrilor de intare a i b nc 1p., pentru declararea corect a parametrilor n i v nc 1p.).

Pentru declararea variabilelor locale nc 1p., iar pentru respectarea structurii subprogramului i a sintaxei limbajului se acord nc 1

Pentru determinarea numrului de apariii ale cifrei a n scrierea unui numr din tabloului 1p. Pentru determinarea numrului de apa
ale cifrei b n scrierea unui numr din tabloului 1p. Pentru determinarea elementelor tabloului cu proprietatea cerut 1p. Pe
tergerea din tablou a tuturor elementelor ce memoreaz numerele cu proprietatea cerut 1p. Pentru corectitudinea global
programului 1p.
n total 10p.

Algoritmul de rezolvare propus citete, unul cte unul, numerele din fiier, analiznd paritatea fiecruia: ntlnirea unui numr pa
duce la "prelungirea" secvenei curente, iar ntlnirea unui numr impar va conduce la trecerea la o nou secven . La finele oric
secvene se analizeaz lungimea ei, n vederea memorrii lungimii maxime.

Eficiena algoritmului, ca timp de executare, const n faptul c parcurgem o singur dat irul. Deoarece numrul de valori din fi
(1000000) este dimensiunea care conteaz n problem, spunem c am obinut un algoritm liniar. Ca spaiu de memorie, solu
propus este eficient, deoarece utilizeaz doar variabile simple.
Pentru o descriere coerent a metodei se acord 1p., iar pentru justificarea eficienei, nc 1p. - n total 2p.

Limbajul Pascal

Limbajul C/C++

var f:text;
nr,lgmax,lg:longint;

#include
#include

Limbajul Pascal

Limbajul C/C++

begin

using namespace std;


ifstream f("bac.in");
int main()
{
int lgmax,lg,nr;
lg=lgmax=0;
while(f>>nr)
if(nr%2==0) lg++;
else {
if(lgmax<lg) lgmax=lg;
lg=0;
}
if(lgmax<lg) lgmax=lg;
cout<<lgmax;
f.close();
}

end.

assign(f,'bac.in');reset(f);
while not eof(f) do begin
read(f,nr);
if nr mod 2=0 then
inc(lg)
else begin
if lgmax<lg then
lgmax:=lg;
lg:=0
end;
end;
if lgmax<lg then
lgmax:=lg;
close(f);
write(lgmax)

Se acord 1p. pentru operaiile cu fiiere (declarare, nume corect i deschidere pentru citire), nc 1p. pentru citirea tuturor numer
din fiier, 1p. pentru un algoritm principial corect, nc 1p. pentru determinarea valorii cerute, 1p. pentru afiarea ei, 1p. pe
corectitudinea formal (declararea variabilelor, structura programului, sintaxa instruciunilor, etc.).
Se acord 1p. pentru alegerea unui algoritm eficient ca timp de executare (O(n)) i 1p. pentru utilizarea eficent a memoriei. n total

Salt la pagina
13

VARIANTA 2 - REZOLVARE - SUBIECTUL 2 (30p)

Din vectorul de referine ascendente deducem c rdcina arborelui este nodul 5 (tata[5]=0). Observm c tata[8]
tata[9]=7, tata[7]=2 tata[2]=5, deci ascendenii nodului 8.sunt nodurile 5,2,7,9.

Pentru precizarea rspunsului d) se acord 4p.

Cercul C intersecteaz axa Ox dac distana de la centru cercului la axa Ox (=C.O.y) este mai mic sau egal cu raza cercului (C.R

Pentru rspunsul b) se acord 4p.


Graful dat se poate reprezenta grafic astfel:

Sunt 3 componente tare conexe:


- componenta ce conne doar nodul 1
- componenta ce conine doar nodul 2
- componenta ce conine nodurile 3,4,5,6.
Pentru scrierea nodurilor 3,4,6 (n orice ordine) se acord 6p.
Se acord punctaj parial: cte 2p pentru fiecare ascendent corect.
La finalul executrii secvenei date coninutul matricei A este:
6 5 4 3 2
7 6 5 4 3
8 7 6 5 4
9 8 7 6 5
10 9 8 7 6
Se observ c suma elementelor de pe diagonala secundar este 30 (=2+4+6+8+10)
Pentru scrierea numrului 30 se acord 6p.

O soluie se poate obine separnd cuvintele din text si verificnd apariia primului cuvnt ca sufix pentru restul cuvintelor din tex
caz afirmativ, aceste cuvinte vor fi eliminate. Se poate contrui un ir nou care s conin cuvintele ce vor rmne n text,
concatenarea acestora i inserarea caracterului * dup fiecare cuvnt.

O alt soluie se poate obine, dup separarea i eliminarea primului cuvnt din ir, prin determinarea tuturor apariiilor primului cuv
n irul rmas. n situaia n care caracterul * succede o astfel de apariie, atunci vom terge din ir cuvntul corespunztor apariiei.
Se pot utiliza funciilor predefinite pentru iruri de caractere specifice limbajului.

Pentru declararea corect a variabilelor se acord 1p. Pentru citirea irului se acord 1p. Pentru separararea primului cuvnt din tex
acord 1p. Pentru determinarea unui cuvnt din text care admite ca sufix primul cuvnt i pentru eliminarea lui se acord 2p.

Pentru eliminarea tuturor cuvintelor din ir cu proprietatea cerut se acord 2p. Pentru modificarea i afiarea irului n formatul ceru
acord 2p. Pentru corectitudinea global a programului se acord 1p - n total 10p.

Limbajul Pascal

Limbajul C/C++

var i,n,j,k :byte;


s,p :string;

int main()
{

Limbajul Pascal

Limbajul C/C++

begin

do

readln(s);
n:=pos('*',s);
p:=copy(s,1,n);
delete(s,1,n);
k:=pos(p,s);
while k>0 do begin
j:=k+n-1;
i:=k;
while (s[i] <> '*') and (i>0)
dec(i);
inc(i);
delete(s,i,j-i);
k:=pos(p,s);

end.

end;
s:='*'+s;
writeln(s)
}

char s[256], t[256], *p, *q;


int i,j,n;
cin>>s;
strcpy(t,"*");
p=strtok(s,"*");
n=strlen(p);
q=strtok(NULL,"*");
while(q)
{
i=n-1;
j=strlen(q)-1;
while(p[i]==q[j] && i>=0 && j>=0)
{i--; j--;}
if(i>0) strcat(t,q);
strcat(t,"*");
q=strtok(NULL,"*");
}
strcpy(s,t);
cout<<s;
return 0;

Salt la pagina
14

VARIANTA 2 - REZOLVARE - SUBIECTUL 3 (30p)


Se genereaz n maniera "naintare cu revenire", cuvintele : abe, abec, abed, ace, aceb, aced, etc.
Pentru rspunsul d) se acord 4p.
a)

Se urmresc apelurile recursive i se fac calculele:

Pentru rspunsul 1765 se acord 3p.


b)

Apelul recursiv f(x div 10)| f(x/10) pentru valorile x care au cifra unitilor mai mic ca 5, sugereaz c aceste cifre s
ignorate.
Cu
restul
cifrelor
se
contruiete
un
numr
care
are
prima
cifr
(prin apelul recursiv x mod 10 +f(x div 10) * 10 | x%10+f(x/10)).
Pentru ca rezultatul s fie 1 trebuie ca toate cifrele lui x s fie strict mai mici dect 5, iar cea mai mare valoare de 4 cifre cu to
cifrele pare este 4444.
Pentru rspunsul 4444 se acord 3p.

Prelucrarea oferit de subprogram determin poziia primei apariii a valorii minime din tablou, poziia ultimei apariii a valo
maxime n ir, apoi interschimb cele dou valori situate pe poziiile determinate. Tabloul rezultat este returnat prin interme
parametrului v al subprogamului.

Limbajul Pascal

Limbajul C/C++

Type vector=array[1..100]of integer;

void sub(int n, int v[])


{
int i, pmin=1, pmax=1,aux;
for(i=2;i<=n;i++)
if (v[i]>=v[pmax])
pmax=i;
else
if (v[i]<v[pmin]) pmin=i
aux=v[pmin];
v[pmin]=v[pmax];
v[pmax]=aux;
}

procedure sub(n:byte;var v:vector);


var pmin,pmax,i:byte;
aux:integer;
begin
pmin:=1;
pmax:=1;
for i:=1 to n do
if v[i]>=v[pmax] then
pmax:=i
else if v[i]<v[pmin]
then pmin:=i;
aux:=v[pmin];
v[pmin]:=v[pmax];
v[pmax]:=aux
end;

Pentru antet corect se acord 2p. Pentru determinarea numrului minim din tabloul v se acord 1p, iar pentru determinarea poz
primei apariii a minimului se acord 2p. Pentru determinarea numrului maxim din tabloul v se acord 1p, iar pentru determina
poziiei ultimei apariii a maximului se acord 2p. Pentru interchimbarea celor dou numere determinate se acord 1p. Pe
corectitudinea global a programului 1p.
b)

Algoritmul de rezolvare propus determin suma cifrelor primului numr sx i apoi citete un numr din fiier, comparnd sum
cifrelor acestuia cu sx: n caz de egalitate se "prelungete" secvena curent, n caz contrar, se trece la o nou secven cu o no
sum sx curent. La finalul oricrei secvene se analizeaz lungimea ei, n vederea memorrii lungimii maxime.

Eficiena algoritmului, ca timp de executare, const n faptul c determinm valoarea cerut n timpul citirii datelor, deci parcurgem
singur dat irul de numere. Ca spaiu de memorie, soluia propus este eficient, deoarece utilizeaz doar variabile simple, f
folosirea unor structuri suplimentare de date.
Pentru o descriere coerent a metodei se acord 1p., iar pentru justificarea eficienei, nc 1p. - n total 2p.

Dei o implementare cu ajutorul unui subprogram ce calculeaz suma cifrelor unui numr natural era mult mai elegant, putem du
la extrem noiunea de eficien, spunnd c apelul unui subprogram necesit operaii n plus (gestiunea stivei la apel i la revenir
deci e mai bine s nu utilizm subprograme. n general, nu considerm c trebuie dus la absurd noiunea de eficien p
invocarea unor detalii tehnice de limbaj, ci ea trebuie s rmn la nivel algoritmic.
a)

Limbajul Pascal

Limbajul C/C++

var f:text;
nr,lgmax,lg,x,sx,snr:longint;
begin
assign(f,'bac.in');reset(f);
read(f,x);
lg:=1;
sx:=0;
while x>0 do begin
sx:=sx+x mod 10;
x:=x div 10

#include <iostream>
#include <fstream>
using namespace std;
ifstream f("bac.in");
int main()
{
int lgmax, lg, nr, sx=0, x, snr;
lg=1;
lgmax=0;
f>>x;

Limbajul Pascal

end.

Limbajul C/C++

end;
while not(eof(f)) do begin
read(f,nr);
snr:=0;
while nr>0 do begin
snr:=snr+nr mod 10;
nr:=nr div 10
end;
if snr=sx then inc(lg)
else begin
if lgmax<lg then lgmax:=lg;
lg:=1;
sx:=snr
end;
end;
if lgmax<lg then lgmax:=lg;
close(f);
write(lgmax)
}

while(x)
{ sx=sx+x%10; x=x/10; }
while(f>>nr)
{
snr=0;
while(nr)
{ snr+=nr%10; nr=nr/10; }
if (snr==sx) lg++;
else {
if(lgmax<lg) lgmax=lg
lg=1;
sx=snr;
}
}
if (lgmax<lg) lgmax=lg;
cout<<lgmax;
f.close();
return 0;

Se acord 1p. pentru operaiile cu fiiere (declarare, nume corect i deschidere pentru citire), nc 1p. pentru citirea tuturor numer
din fiier, 1p. pentru un algoritm principial corect, nc 1p. pentru determinarea valorii cerute, 1p. pentru afiarea ei, 1p. pe
corectitudinea formal (declararea variabilelor, structura programului, sintaxa instruciunilor, etc.).

Se acord 1p. pentru alegerea unui algoritm eficient ca timp de executare (O(n)) i 1p. pentru utilizarea eficent a memorie
total, 8p.

VARIANTA 3 - SUBIECTUL 2 (30p)


Pentru itemii 1 i 2, scriei pe foaia de examen litera corespunztoare rspunsului corect.
1.

Se consider o stiv n care iniial au fost introduse, n aceast ordine, elementele cu valorile 1 i 2:

Se noteaz cu AD(x) operaia prin care se adaug elementul cu valoarea x n stiv i cu EL operaia prin care se elimin
un
element
din
stiv.
Cte
elemente
va
conine
stiva
n
urma
executrii
secvenei
de
operaii: AD(3);EL;EL;EL;AD(2);EL;AD(1)? (4p.)
a. 1
2.

b. 2

c. 3

d. 4

Cte grafuri orientate, distincte, cu 5 vrfuri se pot construi? Dou grafuri se consider distincte dac matricele lor de
adiacen sunt diferite.(4p.)
a. 5

b. 120

c. 210

d. 410

Scriei pe foaia de examen rspunsul pentru fiecare dintre cerinele urmtoare.


3.

n declararea urmtoare, cmpurile x i y ale nregistrrii pot memora coordonatele carteziene ale unui punct din
planul xOy. Scriei o expresie n limbajul Pascal | C/C++ care s aib valoarea true|1 dac i numai dac punctul
memorat n variabila A este situat pe axa Ox, iar punctul memorat n variabila B este situat pe axa Oy. (6p.)
Limbajul Pascal

Limbajul C/C++

type punct=record
x,y:real

end;
var A,B:punct;
4.

struct punct
{ float x,y; } A,B;

Se consider un arbore cu rdcin reprezentat prin urmtorul vector "de tai": (0,1,1,1,4,4,6,7).
Scriei toate lanurile elementare distincte, de lungime maxim, care au extremitatea final n nodul 8. (6p.)

5.

S se construiasc o matrice cu n linii i m coloane care conine:


- pe prima coloan, de sus n jos, toate numerele naturale de la 1 la n, n ordine cresctoare;
- pe prima linie, de la stnga la dreapta toate numerele naturale de la 1 la m, n ordine cresctoare;
Restul elementelor se vor iniializa cu suma elementelor vecine situate n stnga i deasupra elementului curent, ca n
exemplu.
Scriei programul care citete de la tastatur dou valori naturale n i m (2<n<25, 2<m<25), construiete matricea
conform cerinei i o afieaz pe ecran, pe linii, cu spaii ntre elementele de pe fiecare linie.
De exemplu, dac se citete de la tastatur n=3 i m=5, se va construi i se va afia pe ecran matricea:
1 2 3 4 5
2 4 7 11 16
3 7 14 25 41
(10p.)

Salt la pagina
19

VARIANTA 3 - REZOLVARE - SUBIECTUL 2 (30p)

Stiva conine iniial dou elemente si mai sunt adugate nc trei. n total au fost adugate n stiv cinci elemente. Sunt eliminate pa
elemente din coad. Astfel rmne un singur element n stiv.
Pentru precizarea rspunsului a) se acord 4p.
Fiecrui graf i corespunde o funcie
f:{(i,j)|ij, 1i,j5} -> {0,1,2,3}
care asociaz perechii de vrfuri distincte (i,j) valoarea:

0 dac nu exist arc de la i la j

1 dac exist arc de la i la j

2 dac exist arc de la j la i

3 dac exist arc de la i la j i exist arc de la j la i

Numrul grafurilor cu cte n vrfuri este egal cu numrul acestor funcii, adic

Pentru rspunsul d) se acord 4p.


Un rspuns corect:
Pascal: (A.y=0) and (B.x=0)
C/C++: (A.y==0) && (B.x==0)
Pentru orice rspuns corect se acord 6p.
Cele mai lungi lanuri elementare din arbore cu o extremitate n nodul 8 sunt: [2,1,4,6,7,8] i [3,1,4,6,7,8].

Se acord cte 3p pentru fiecare lan corect. n total 6p.

Pot fi concepute mai multe metode de obinere a matricei cerute. Metoda clasic ce completeaz coloanele matricei, cu liniile, respe
coloanele, numerotate de la 1 la n, respectiv de la 1 la m, n maniera descris, este:

Pentru declararea corect a matricei se acord 1p., pentru citirea lui n i m se mai acord 1p., pentru completarea corect a primei lini
acord 1p., pentru completarea corect a primei coloane se acord 1p., pentru completarea corect a celorlalte elemente se acord 3p.
pentru afiarea matricei conform cerinei se acord 2p. n plus, pentru declararea variabilelor simple, structura i corectitudinea sintactic
programului se mai acord 1p. - n total 10p.

Salt la pagina
17

VARIANTA 3 - SUBIECTUL 3 (30p)


Pentru itemul 1, scriei pe foaia de examen litera corespunztoare rspunsului corect.

Utiliznd metoda backtracking se genereaz n ordine cresctoare toate numerele naturale de cte cinci cifre din mulimea A={1,2,3,
numere n care suma primelor dou cifre este 5 .Primele numere generate sunt, n ordine: 14111, 14112, 14113, 14114, 14121, 1412
Cte dintre numerele generate ncep i se termin cu cifra 3? (4p.)
a. 4

b.8

c. 12

d. 16

Scriei pe foaia de examen rspunsul pentru fiecare dintre cerinele urmtoare.


Se consider subprogramul f cu
definiia urmtoare:
Limbajul Pascal
procedure f(x:longint);
begin
if x>9 then begin
write(x mod
10);
f(x div 10);
write("*")
end
else write("#");

Limbajul C/C++
void f(int x) {
if(x>9) {
printf("%d",x%10);/ cout<<x%10;
f(x/10)
printf("*"); / cout<<"*";
}
else cout<<"#";
}

end;
a) Scriei ce se va afia n urma apelului f(12345). (3p.)

b) Scriei toate valorile numere naturale pe care le poate avea o variabil n, astfel nct pentru apelul f(n) s se afieze d
caracterul #. (3p.)
Scriei definiia complet a unui subprogram sub, cu trei parametri, care primete prin intermediul parametrilor:
-

x, un numr natural, avnd cel mult patru cifre;

n, un numr natural nenul (0 < n < 100);

v, un tablou unidimensional care memoreaz un ir de n numere naturale, fiecare avnd cel mult patru cifre;

Subprogramul sub determin dublarea fiecrei apariii a valorii parametrului x n irul de numere primit prin parametrul v. De aseme
subprogramul va furniza prin intermediul parametrului n numrul de numere din irul modificat, iar prin parametrul v tabloul modificat. D
valoarea parametrului x nu apare n irul de numere atunci valorile parametrilor nu se vor modifica.

Exemplu. Pentru valorile n=10, v=(51, 19, 3, 52, 19, 215, 19, 19, 4, 65), x=19 ale parametrilor, n urma apelului, subprogramului sub
furniza prin parametrii indicai valorile n=14 i v=(51, 19, 19, 3, 52, 19, 19, 215, 19, 19, 19, 19, 4, 65).
(10p.)

Fiierul text BAC.TXT conine un ir s de cel mult un milion de numere naturale, formate fiecare din cel mult 9 cifre, separate prin cte
spaiu

a) Scriei un program C/C++ care citete numerele din fiier i determin, utiliznd un algoritm eficient din punct de vedere al memo
utilizate i al timpului de executare, lungimea secvenei obinute prin eliminarea din cele dou extremiti ale irului s a unui numr minim
numere, fr a schimba ordinea celorlalte numere, astfel nct secvena rezultat s nceap cu un numr format doar din cifre pare i s
termine cu un numr format doar din cifre impare. Programul va afia pe ecran lungimea secvenei obinute.
De exemplu, dac fiierul BAC.TXT conine numerele:
132 214 62 34 28 34 8 45 18 72 35 12 17 34 4 135 63 81 101

pe ecran se va afia numrul 14, deoarece secvena cutat se obine prin eliminarea numerelor subliniate i este format din
numere (8p.)
b) Descriei succint, n limbaj natural, metoda de rezolvare folosit, explicnd n ce const eficiena ei (3 - 4 rnduri). (2p.)

Salt la pagina
20

VARIANTA 3 - REZOLVARE - SUBIECTUL 3 (30p)


Numerele cerute sunt de forma: 32xx3 cu x{1,2,3,4}. Sunt generate 4x4=16 numere cu proprietatea din enun.
Pentru rspunsul d) se acord 4p.
a)

n desenul alturat este prezentat mecanismul prin care se execut apelul f(12345) al subprogramului recursiv f. Se vor afia
ordine: 5432#****, rspuns pentru care se acord 3p.

b)

Se observ c la n urma executrii apelurilor f(0), f(1), f(2), f(3), f(4), f(5), f(6), f(7), f(8) i f(9), se va afia de fiecare dat caracteru
Pentru rspunsul 0,1,2,3,4,5,6,7,8,9 se acord 3p.

Prelucrarea oferit de subprogram determin fiecare apariie a valorii x n tablou. Dublarea unui element cu valoarea x se realize
prin deplasarea cu o poziie la dreapta a tuturor elementelor situate la dreapta celui ce urmeaz a fi dublat, ncepnd de la sfr
irului. Dup realizarea deplasrii, se mrete valoarea lui n cu 1.

Limbajul Pascal

Limbajul C/C++

Type vector=array[1..100]of integer;


procedure sub(x:integer;var n:byte;var v:vector);
var i,j:byte;
begin
i:=1;
while i<=n do begin
if v[i]=x then begin
for j:=n downto 1 do
v[i+1]:=v[i];
n:=n+1;
i:=i+1
end;
i:=i+1
end;
end;

void sub(int x, int &n, int v[]) {


int i=1,j;
while(i<=n)
{
if(v[i]==x) {
for(j=n;j>=1;j--)
v[j+1)=v[j];
n++;
i++;
}
i++;
}
}

Pentru antet corect se acord 3p. (Pentru respectarea structurii antetului (procedure/void) se acord 1p., pentru declararea core
a parametrilor de intare x, pentru declararea corect a parametrilor n i v nc 1p., pentru declararea variabilelor locale nc 1p).
Pentru determinarea fiecrei apariii ale numrului x n tabloul 1p. Pentru dublarea primei apariii n tabloului i incrementarea va
parametrului n se acord cte 1p. Pentru determinarea tuturor apariiilor lui x n tablou se acord 2p. Pentru marirea corespunzto
valorii parametrului n se acord 1p. Pentru corectitudinea global a programului 1p.
n total 10p.
b)

Algoritmul de rezolvare propus presupune determinarea poziei pp a primului numr format doar din cifre pare, respectiv ui a ultim
numar format doar din cifre impare, din fiier pe msura citirii datelor i utilizeaz doar variabile simple fr folosirea unor struc
suplimentare de date.

Eficiena algoritmului, ca timp de executare, const n faptul c parcurgem o singur dat irul cu un numr impresionant de num
Deoarece numrul de valori din fiier (1000000) este dimensiunea care conteaz n problem, spunem c am obinut un algo
liniar. Ca spaiu de memorie, soluia propus este eficient, deoarece utilizeaz doar variabile simple.
Lungimea subirului cutat va fi: ui-pp+1 sau 0 dac pp=0 sau ui=0.
Pentru o descriere coerent a metodei se acord 1p., iar pentru justificarea eficienei, nc 1p. - n total 2p.
a)

Limbajul Pascal

Limbajul C/C++

var f:text;
nr,i, pp, ui,p, imp:longint;
begin
assign(f,'bac.in'); reset(f);
while not(eof(f)) do begin
read(f,nr);
inc(i);
p:=0;
imp:=0;
repeat
if nr mod 2=0 then inc(p)
else inc(imp);
nr:=nr div 10
until nr=0;
if (imp=0) and (pp=0) then pp=i
else if (p==0) ui:=i;
end;
if pp*up=0 then writeln ('0')
else writeln(ui-pp+1);
close(f);
end.

#include <iostream>
#include <fstream>
using namespace std;
ifstream f("bac.in");
int main()
{
int pp=0, ui=0, i=0, nr, p, imp;
while(f>>nr)
{
p=imp=0;
i++;
do
{
if(nr%2==0) p++;
else imp++;
nr/=10;
}while(nr>0);
if(imp==0 && pp=0)pp=i;
else if (p==0) ui=i;
}
if(pp*ui) cout<<"Nu exista";
else cout<<ui-pp+1;
f.close();
}

Se acord 1p. pentru operaiile cu fiiere (declarare, nume corect i deschidere pentru citire), nc 1p. pentru citirea tuturor numerel
din fiier, 1p. pentru un algoritm principial corect, nc 1p. pentru determinarea valorii cerute, 1p. pentru afiarea ei, 1p. pentru
corectitudinea formal (declararea variabilelor, structura programului, sintaxa instruciunilor, etc.).

Se acord 1p. pentru alegerea unui algoritm eficient ca timp de executare (O(n)) i 1p. pentru utilizarea eficent a memorie
total 8p.

VARIANTA 4 - SUBIECTUL 1 (30p)

ru itemul 1, scriei pe foaia de examen litera corespunztoare rspunsului corect.

Considernd o variabil x de tip real, indicai expresia care are valoarea true/1 dac i numai dac x[1,5][7,9]. (4p.)
Limbajul Pascal

Limbajul C/C++

((x>=1) or (x<=9)) and ((x<=5) or (x>=7))

(x>=1 || x<=9) && (x<=5 || x>=7)

not((x>0) and (x<7)) and (x>=1)

!(x>5 && x<7) && x>=1

(x>=1) and (x<=5) and (x>=7) and (x<=9)

x>=1 && x<=5 && x>=7 && x<=9

not((x<1) or ((x>5) and (x<7)) or (x>9))

!(x<1 || (x>5 && x<7) || x>9)

Se consider algoritmul urmtor reprezentat n pseudocod:

notat cu x%y restul mpririi numrului natural x la numrul natural nenul y, iar cu [x] partea ntreag a numrului real x.

Ce valoare va fi afiat dac se citesc valorile 7 i 13? (6p.)


Pentru a=10, scriei cea mai mare valoare care poate fi introdus pentru b astfel nct rezultatul afiat s fie 4. (4p.)

Scriei n pseudocod un algoritm, echivalent cu cel dat, n care s se nlocuiasc structura pentru j<-2,[i/2] execut... c
structur repetitiv de alt tip. (6p.)
Scriei programul Pascal/C/C++ corespunztor algoritmului dat. (10p.)

Salt la pagina
24

VARIANTA 4 - REZOLVARE - SUBIECTUL 1 (30p)


Un numr real

dac i numai dac

Pentru precizarea rspunsului d) se acord 4p.

Algoritmul calculeaz cte numere prime exist ntre a i b, deoarece variabila d va conine fie cel mai mare divizor propriu al u
numr i cuprins ntre a i b, fie valoarea 0 dac numrul i nu are niciun divizor propriu (ceea ce nseamn c numrul i este prim
Pentru precizarea valorii 3 (ntre 7 i 13 exist 3 numere prime: 7, 11 i 13) se acord 6p.

Deoarece a=10, nseamn c trebuie determinat cea mai mare valoare posibil pentru b astfel nct ntre 10 i b s existe 4 num
prime. Se observ uor faptul c ntre 10 i 19 exist 4 numere prime (11, 13, 17 i 19), numerele 20, 21 i 22 nu sunt prime
numrul 23 este prim, deci cea mai mare valoare posibil pentru b astfel nct ntre 10 i b s existe 4 numere prime este 22.

Pentru precizarea valorii 22, se acord 4p.

Structura repetitiv pentru j2,[i/2] execut se poate nlocui cu una dintre structurile repetitive ct
executsau repet... pn cnd, avnd grij la iniializarea, testarea i incrementarea variabilei j:

Limbajul Pascal

timp

Limbajul C/C++

Atragem atenia c structura ct timp...execut asigur echivalena cu structura pentru...execut n toate situaiile,
cnd structura repet...pn cnd este echivalent doar n unele situaii, printre care i cea din acest algoritm.

Pentru alegerea unei structuri repetitive se acord 2 p., pentru iniializarea lui j se acord 1p., pentru testarea condiiei de continu
sau oprire se acord 1p., pentru incrementarea lui j se acord 1p., iar pentru scrierea integral a restului algoritmului se mai aco
1p. - n total 6p.

Se testeaz capacitatea de a reprezenta pe hrtie algoritmul dat folosind un limbaj de programare studiat. Pentru instruciunile core
de declarare a variabilelor, de citire a datelor, de afiare a rezultatului i de decizie se acord cte 1p., pentru cele dou instruc
repetitive se acord 3p., iar pentru cele 4 atribuiri se acord 2p. Pentru structura corect a programului se mai acord 1p., dec
total10p.

VARIANTA 4 - SUBIECTUL 2 (30p)

ru itemii 1 i 2, scriei pe foaia de examen litera corespunztoare rspunsului corect.

Fie G un graf neorientat complet cu 10 vrfuri. Numrul maxim de muchii care pot fi eliminate din G astfel nct acesta s rm
conex este: (4p.)
9

b. 32

c. 36

d. 40

Se consider tipul de date Data, capabil s memoreze o dat calendaristic i tipul de date Elev, capabil s memoreze num

data naterii i media anual a unui elev. Care dintre urmtoarele expresii are valoare true/1 dac i numai dac elevul
crui date sunt memorate n variabila e de tipul Elev este nscut n anul 2000? (4p.)

bajul Pascal

Limbajul C/C++

e^.data_nasterii^.an = 2000

e->data_nasterii->an == 2000

e.data_nasterii.an = 2000

e.data_nasterii.an == 2000

e.an = 2000

e.an == 2000

data_nasterii.an = 2000

data_nasterii.an == 2000

ei pe foaia de examen rspunsul pentru fiecare dintre cerinele urmtoare.

Se consider un graf neorientat G cu 6 noduri etichetate cu numerele de la 1 la 6, graf dat prin listele de adiacen de mai jos:
1:
2:
3:
4:
5:
6:

2
1
2
3
3
1

6
3
4 5 6
5
4
3

Verificai dac graful G este eulerian i, n caz afirmativ, scriei un ciclu eulerian din vrful 1. (6p.)
Se consider dou iruri de caractere s i t declarate prin:
Pascal: var s,t:string[30];
C/C++: char s[31],t[31];

tiind c ambele iruri sunt formate numai din litere mici ale alfabetului englez, scriei doar instruciunea sau instruciunile c
afieaz pe ecran mesajul DA n cazul n care irul s este un prefix al irului t sau mesajul NU n caz contrar. (6p.)

S se construiasc o matrice cu n linii i n coloane care conine pe prima linie numerele naturale de la 1 la n n ord
cresctoare, pe a doua linie numerele naturale de la n+1 la 2n n ordine descresctoare, pe a treia linie numerele naturale
la 2n+1 la 3n n ordine cresctoare, pe a patra linie numerele naturale de la 3n+1 la 4n n ordine descresctoare i aa
departe pn la linia n. Scriei programul care citete de la tastatur o valoare natural n (2<=n<=50), construiete matr
conform cerinei i o afieaz pe ecran, pe linii, cu spaii ntre elementele de pe fiecare linie.

De exemplu, dac se citete de la tastatur n=5, se va construi i se va afia matricea:


1 2 3 4 5
10 9 8 7 6
11 12 13 14 15
20 19 18 17 16
21 22 23 24 25
(10p.)

VARIANTA 4 - REZOLVARE - SUBIECTUL 2 (30p)

Deoarece graful G este complet, nseamn c el este conex i are


de muchii. Deoarece un graf conex maximal (adic
graf care prin eliminarea unei singure muchii devine neconex) cu n vrfuri este un arbore, rezult c graful G trebuie s conin
puin
muchii (orice arbore cu n vrfuri are n-1 muchii!), deci se pot elimina maxim 45-9=36 de muchii.
Pentru precizarea rspunsului c) se acord 4p.

Deoarece variabila e de tip Elev conine data naterii elevului respectiv n cmpul data_naterii de tip Data, rezult c data na
elevului respectiv (adic ziua, luna i anul) se poate accesa prin expresia e.data_naterii, deci anul naterii sale poate fi accesat
expresia e.data_naterii.an.
Pentru rspunsul b) se acord 4p.
Graful dat se poate reprezenta grafic astfel:

Se observ faptul c graful dat este eulerian, deoarece este conex i gradul oricrui vrf este un numr par. Din vrful 1 se pot constr
cicluri euleriene:
i
.
Pentru scrierea nodurilor oricruia dintre ciclurile euleriene

sau

se acord 6p.

irul t este un prefix al irului s dac este un subir al lui s care ncepe pe prima poziie:
Limbajul Pascal

Limbajul C/C++

if Pos(t,s)=1 then
writeln('DA')
else
writeln('NU');

if(strstr(s,t)==s)
cout<<"DA";
else
cout<<"NU";

Pentru utilizarea funciei corespunztoare se acord 3p., pentru afiarea irului de caractere cerut se acord 2p., iar pentru corectitudi
sintactic a secvenei se mai acord 1p. - n total 6p.
Pot fi concepute mai multe metode de obinere a matricei cerute, una dintre ele fiind urmtoarea:

Pentru declararea corect a matricei se acord 1p., pentru citirea lui n se mai acord 1p., pentru parcurgerea unei linii se acord 1p., pe
completarea corect a unei linii (par+impar) se acord 1p.+1p., pentru completarea corect a tuturor liniilor (pare+impare) se acord
+1p., iar pentru afiarea matricei conform cerinei se acord 2p. n plus, pentru declararea variabilelor simple, structura i corectitudi
sintactic a programului se mai acord 1p. - n total 10p

VARIANTA 4 - SUBIECTUL 3 (30p)

ru itemul 1, scriei pe foaia de examen litera corespunztoare rspunsului corect.

Utiliznd metoda backtracking se genereaz, n ordinea cresctoare a valorii, toate numerele formate din exact n cifre nen
distincte
i
avnd
suma
cifrelor
egal
cu s.
Astfel,
pentru n=2 i s=10,
se
obin,
n
ord
numerele:19,28,37,46,64,73,82,91. Folosind aceeai metod, se genereaz numerele formate din n=4 cifre distinct
avnd suma cifrelor s=25.
Care
(4p.)
3598

va

fi

al

b. 2986

i pe foaia de examen rspunsul pentru fiecare dintre cerinele urmtoare.


Funcia f are definiia urmtoare:

treisprezecelea

c. 358
9

d. 3679

numr

gene

bajul Pascal

Limbajul C/C++

criei valoarea care se obine n urma apelului f(24,2). (3p.)

criei cea mai mare valoare de 3 cifre pe care o poate avea o variabil x, astfel nct pentru apelul f(x,2) s se obin valoarea 0. (3p.)

Scriei definiia complet a subprogramului cifre, cu doi parametri, care primete prin intermediul parametrului a un nu
natural format din maxim 9 cifre i furnizeaz prin al doilea parametru b numrul obinut prin eliminarea cifrelor lui a aflate
poziii pare. Cifrele numrului a se numeroteaz de la dreapta spre stnga, ncepnd cu poziia 0 (corespunztoare c
unitilor).
Exemplu: pentru a=2334157, valoarea returnat prin b va fi 345. (10p.)
Fiierul text bac.in conine, pe prima linie, cel mult 1000000 de numere naturale nenule, fiecare fiind format din
mult 9cifre. Oricare dou numere consecutive sunt desprite printr-un spaiu.

a) Scriei un program care, folosind un algoritm eficient din punct de vedere al timpului de executare i al spaiului de mem
utilizat, determin i scrie n fiierul bac.out cel mai mare numr natural care se poate obine din cifrele tuturor numerelor
fiierul bac.in. (8p.)
Exemplu: dac fiierul bac.in conine numerele 2117
numrul98877555321110.

90

885

515

37, atunci fiierul bac.out trebuie s con

b) Descriei n limbaj natural metoda utilizat i explicai n ce const eficiena ei. (2p.)

VARIANTA 4 - REZOLVARE - SUBIECTUL 3 (30p)

Se genereaz n maniera "naintare cu revenire", numerele: 1789, 1798, 1879, 1897, 1978, 1987, 2689, 2698, 28
2896, 2968, 2986, 3589, etc.
Pentru rspunsul c) se acord 4p.
a)

Se urmresc apelurile recursive i se fac calculele:


f(12,2)=2+f(12,3)=2+3+f(12,4)=2+3+4+f(12,5)= 2+3+4+f(12,6)=2+3+4+6+f(12,7)=2+3+4+6+0=15
Pentru rspunsul 15 se acord 3p.

b)

n urma apelului f(x,2) se va calcula suma divizoriilor proprii ai numrului x, deci valoarea 0 se va obine dac i nu
dac x este un numr prim.
Pentru rspunsul 997 (cel mai mare numr prim cu 3 cifre) se acord 3p.

Subprogramul construiete valoarea cerut cifr cu cifr, adugnd la numrul b (iniial egal cu 0) doar cifrele numrului a care

gsesc pe poziii impare. Numerotarea cifrelor lui a se realizeaz de la dreapta spre stnga, folosind variabila auxiliar p, ncep
cu poziia 0 (corespunztoare cifrei unitilor). Deoarece cifrele lui a sunt accesibile de la ultima ctre prima, trebuie utilizate nmu
cu puteri consecutive ale lui 10.

Limbajul Pascal

Limbajul C/C++

procedure cifre(a:longint; var b:longint);


var uc,p:byte; z:longint;
begin
b:=0;
z:=1;
p:=0;
while a>0 do
begin
uc:=a mod 10;
if p mod 2=1 then
begin
b:=b+uc*z;
z:=z*10
end;
a:=a div 10;
p:=p+1
end
end;

void cifre(int a,int &b)


{
int uc,p,z;
b=0;
z=1;
p=0;
while(a>0)
{
uc=a%10;
if(p%2==1)
{
b=b+uc*z;
z=z*10;
}
a/=10;
p++;
}
}

Pentru respectarea structurii antetului (procedure/void) se acord 1p., pentru declararea corect a parametrului de intare a
1p., pentru declararea corect a parametrului de ieire b nc 1p., pentru declararea variabilelor locale nc 1p., iar pe
respectarea structurii subprogramului i a sintaxei limbajului se acord nc 1p. Corectitudinea algoritmic a prelucrrii n vede
obinerii valorii cerute este notat cu 4p. Pentru transmiterea natural a rezultatului prin parametrul b se acord 1p, acea
nsemnnd c valoarea luib nu se afieaz i nu se returneaz explicit. n total 10p.
b)

Vom utiliza un vector de frecvene cu 10 elemente fc pentru a contoriza apariiile fiecrei cifre. Vom parcu
fiierul bac.in caracter cu caracter, folosind variabila c de tip char, i, n cazul n care variabila c conine o cifr, vom cre
frecvena sa cu 1. Cel mai mare numr care se poate forma folosind cifrele tuturor numerelor din fi ier se obine scriind
fiierul bac.out fiecare cifr c, de la 9 la 0,de un numr de ori egal cu frecvena sa.

Eficiena algoritmului din punct de vedere al timpului de executare const n faptul c parcurgem o singur dat fiierul
intrarebac.in, obinnd astfel un algoritm liniar n raport cu numrul de cifre din fiier. Eficiena algoritmului din punct de veder
memoriei utilizate const n faptul c se va folosi doar un vector de frecvene cu 10 componente, evitnd astfel memorarea tut
celor maximum 9000000 de cifre din fiier ntr-un vector de caractere.
Pentru o descriere coerent a metodei se acord 1p., iar pentru justificarea eficienei, nc 1p. n total 2p.
a)

Limbajul Pascal

Limbajul C/C++

var fin,fout:text;
c:char; i,j:longint;
fc:array[0..9]of byte;
begin
assign(fin,'bac.in'); reset(fin);
assign(fout,'bac.out'); rewrite(fout);
for i:=0 to 9 do fc[i]:=0;
while(not eof(fin)) do
begin
read(fin,c);

#include <fstream>
using namespace std;
ifstream fin("bac.in");
ofstream fout("bac.out");
int main()
{
int fc[10],i,j;
char c;
for(i=0;i<10;i++)
fc[i]=0;

Limbajul Pascal

Limbajul C/C++
if((c>='0')and(c<='9')) then
inc(fc[ord(c)-ord('0')]);

end.

end;
close(fin);
for i:=9 downto 0 do
for j:=1 to fc[i] do
write(fout,i);
close(fout);

while(fin>>c)
if((c>='0')&&(c<='9'))
fc[c-'0']++;
fin.close();
for(i=9;i>=0;i--)
for(j=0;j<fc[i];j++)
fout<<i;
fout.close();

Se acord 1p. pentru operaiile cu fiiere (declarare, nume corect i deschidere pentru citire), nc 1p. pentru citirea tuturor cifrelor
fiier, 1p. pentru un algoritm corect, nc 2p. pentru determinarea numrului cerut i 1p. pentru corectitudinea formal (declara
variabilelor, structura programului, sintaxa instruciunilor, etc.).
Se acord 1p. pentru alegerea unui algoritm eficient ca timp de executare i 1p. pentru utilizarea eficent a memoriei. n total 8p.

VARIANTA 5 - SUBIECTUL 1 (30p)

ru itemul 1, scriei pe foaia de examen litera corespunztoare rspunsului corect.

Fie n o variabil de tip ntreg care conine un numr natural format din exact 3 cifre. Indicai expresia care are valoarea true/1 dac i nu
prima cifr a numrului n este egal cu ultima. (4p.)
Limbajul Pascal

Limbajul C/C++

n div 10 = n mod 100

n/10==n%100

n mod 10 = n div 100

n%10==n/100

n div 10 = n div 100

n/10==n/100

n mod 10 = n mod 100

n%10==n%100

Se consider algoritmul urmtor reprezentat n pseudocod:

notat cu x%y restul mpririi numrului natural x la numrul natural nenul y, iar cu [x] partea ntreag a numrului real x.

Ce valoare va fi afiat dac se citesc valorile 201 i 208? (6p.)


Pentru a=818, scriei cea mai mare valoare care poate fi introdus pentru b astfel nct rezultatul afiat s fie 7. (4p.)

Scriei n pseudocod un algoritm, echivalent cu cel dat, n care s se nlocuiasc structura pentru...execut cu o struc
repetitiv de alt tip. (6p.)
Scriei programul Pascal/C/C++ corespunztor algoritmului dat. (10p.)

VARIANTA 5 - REZOLVARE - SUBIECTUL 1 (30p)


Ultima cifr a numrului n este egal cu restul mpririi sale la 10, iar prima cifr este dat de ctul mpririi sale la 100.
Pentru precizarea rspunsului b) se acord 4p.
Algoritmul calculeaz cte numere formate doar din cifre pare exist ntre a i b.
Pentru precizarea valorii 4 (ntre 201 i 208 exist 4 numere formate doar din cifre pare: 202, 204, 206 i 208) se acord 6p.

Deoarece a=818, nseamn c trebuie determinat cea mai mare valoare posibil pentru b astfel nct ntre 818 i b
existe 7numere formate doar din cifre pare. Se observ faptul c ntre 818 i 828 exist 5 numere cu aceast proprie
(820, 822, 824,826 i 828), ntre 829 i 839 nu exist nici un numr cu aceast proprietate (toate conin cifra impar 3),
numerele 840 i 842au proprietatea cerut. n concluzie, cea mai mare valoare posibil pentru b este 843 (numrul 844 este for
doar din cifre pare, deci algoritmul ar afia valoarea 8).
Pentru precizarea valorii 843, se acord 4p.
Structura repetitiv pentru ia,b execut... se poate nlocui cu una dintre structurile repetitive ct
executsau repet... pn cnd, avnd grij la iniializarea, testarea i incrementarea variabilei i:

timp

Atragem atenia c structura ct timp...execut asigur echivalena cu structura pentru...execut n toate situaiile,
cnd structura repet...pn cnd este echivalent doar n unele situaii, printre care i cea din acest algoritm.

Pentru alegerea unei structuri repetitive se acord 2 p., pentru iniializarea lui i se acord 1p., pentru testarea condiiei de continu
sau oprire se acord 1p., pentru incrementarea lui i se acord 1p., iar pentru scrierea integral a restului algoritmului se mai aco
1p. - n total 6p.

Se testeaz capacitatea de a reprezenta pe hrtie algoritmul dat folosind un limbaj de programare studiat. Pentru instruciunile core
de declarare a variabilelor, de citire a datelor, de afiare a rezultatului i de decizie se acord cte 1p., pentru cele dou instruc
repetitive se acord 3p., iar pentru cele 7 atribuiri se acord 2p. Pentru structura corect a programului se mai acord 1p., dec
total 10p.

VARIANTA 5 - SUBIECTUL 2 (30p)

ru itemii 1 i 2, scriei pe foaia de examen litera corespunztoare rspunsului corect.

Un graf orientat are 8 vrfuri, numerotate de la 1 la 8, i arcele: (1,2), (2,3), (2,6), (6,1), (6,5), (3,6), (4,5), (3,2), (5,4
(3,4). Numrul vrfurilor care au gradul intern egal cu gradul extern este: (4p.)
4

b. 1

c. 2

d. 3

Se consider tipul de date Punct2D, capabil s memoreze coordonatele unui punct n plan, i tipul de date Punct3D, capabi
memoreze coordonatele unui punct n spaiu. Care dintre urmtoarele secvene de instruciuni poate fi folosit pentru a iniia
toate coordonatele punctului q cu valoarea 0? (4p.)

bajul Pascal

Limbajul C/C++

e Punct2D=record
x,y:real;
end;

e Elev=record
p:Punct2D;
z:real;
end;
q:Punct3D;

struct Punct2D
{
double x,y;
};
struct Punct3D
{
Punct2D p;
double z;
};
Punct3D q;

q.x:=0;q.y:=0;q.z:=0;

q.x=q.y=q.z=0;

q.p:=0;q.z:=0;

q.p=q.z=0;

q.p.x:=0;q.p.y:=0;q.z:=0;

q.p.x=q.p.y=q.z=0;

q.p.x:=0;q.p.y:=0;q.p.z:=0;

q.p.x=q.p.y=q.p.z=0;

ei pe foaia de examen rspunsul pentru fiecare dintre cerinele urmtoare.


Se consider un arbore cu rdcin avnd 8 noduri, etichetate cu numerele de la 1 la 8, dat prin urmtorul vector de
(5,3,8,8,0,1,5,5). Scriei nodurile din arborele cu rdcin dat care sunt frunze. (6p.)
Considerm urmtoarea secven de program:
Limbajul Pascal

Limbajul C/C++

var s:string[20];
...................
s:='examene';
s:=s+copy(s,3,3);
s:=copy(s,5,20);
writeln(length(s));

char s[20];
...................
strcpy(s,"examene");
strncat(s,s+2,3);
strcpy(s,s+4);
cout<<strlen(s);

Scriei ce se va afia pe ecran n urma executrii secvenei de instruciuni de mai sus. (6p.)

Scriei un program care citete de la tastatur un numr natural n (3n50) i elementele unui tablou bidimensional cu n
i ncoloane, numere naturale cu cel mult patru cifre, apoi modific tabloul n memorie, eliminnd elementele aflate pe diagon
principal, ca n exemplu. Programul trebuie s afieze pe ecran tabloul obinut, fiecare linie a tabloului pe cte o linie a ecranu
elementele de pe aceeai linie fiind separate prin cte un spaiu.
Exemplu: pentru n=4 i tabloul
7
8
4
0

5
1
6
9

3
5
3
9

4
6
5
6

programul trebuie s afieze pe ecran tabloul de mai jos:


5 3 4

8 5 6
4 6 5
0 9 9
(10p.)

VARIANTA 5 - REZOLVARE - SUBIECTUL 2 (30p)


Graful dat se poate reprezenta grafic astfel:

Se observ uor faptul c doar vrfurile 1, 2 i 6 au gradul intern egal cu gradul extern.
Pentru precizarea rspunsului d) se acord 4p.

Deoarece variabila q de tip Punct3D conine coordonatele x i y ale unui punct din spaiu n cmpul p de tip Punct2D, rezult c ace
coordonate se pot accesa prin expresiile q.p.x i q.p.y, n timp ce coordonata z poate fi accesat prin expresia q.z.
Pentru rspunsul c) se acord 4p.

Arborele cu rdcin dat se poate reprezenta grafic ca n imaginea de mai jos i se observ faptul c nodurile 2, 4, 6 i 7 sunt fru
(noduri terminale). Acelai lucru se poate observa i direct din vectorul de tai, deoarece nodurile respective nu sunt tai pentru alte v
din arbore.

Pentru scrierea nodurilor 2, 4, 6 i 7, n orice ordine, se acord 6p.


n urma executrii instruciunilor din secvena dat, irul s se va transforma astfel: examene -> exameneame -> eneame.
Pentru scrierea valorii 6 se acord 6p.

Pentru a elimina elementul aflat pe diagonala principal pe o linie i a matricei (respectiv elementul aflat pe coloana j=i), se vor dep
cu o poziie spre stnga elementele aflate pe urmtoarele poziii (respectiv pe coloanele i+1,i+2,...,n), obinndu-se astfel o mat

cu n linii i n-1 coloane:

Pentru declararea corect a matricei se acord 1p., pentru citirea lui n se mai acord 1p., pentru citirea elementelor matricei se
acord 1p., pentru eliminarea corect a tuturor elementelor aflate pe diagonala principal se mai acord 4p., iar pentru afi area mat
conform cerinei se acord 2p. n plus, pentru declararea variabilelor simple, structura i corectitudinea sintactic a programului se
acord 1p. - n total 10p.

VARIANTA 5 - SUBIECTUL 3 (30p)

ru itemul 1, scriei pe foaia de examen litera corespunztoare rspunsului corect.

Utiliznd metoda backtracking se genereaz, n ordinea cresctoare a valorii, toate numerele formate din exact n cifre aflat
ordine strict cresctoare i avnd prima cifr cel puin egal cu c. Astfel, pentru n=3 i c=5, se obin, n ord
numerele: 567, 568, 569,578, 579, 589, 678, 679, 689 i 789. Folosind aceeai metod, se genereaz numerele form
din n=5 cifre aflate n ordine strict cresctoare i avnd prima cifr cel puin egal cu c=3.
Care va fi al zecelea numr generat? (4p.)
a. 34789

b. 35678

i pe foaia de examen rspunsul pentru fiecare dintre cerinele urmtoare.


Funcia f are definiia urmtoare:

bajul Pascal

criei valoarea care se obine n urma apelului f(100100,1). (3p.)

Limbajul C/C++

c. 34689

d. 357

criei cea mai mare valoare format din 7 cifre pe care o poate avea o variabil n, astfel nct pentru apelul f(n,7) s se ob
area 2. (3p.)

Scriei definiia complet a subprogramului divp, cu 3 parametri, care primete prin intermediul parametrului a un numr nat
cuprins ntre 2 i 1000000000 i furnizeaz prin al doilea parametru b cel mai mic divizor propriu al numrului a, iar prin cel d
treilea parametru c furnizeaz cel mai mare divizor propriu al numrului a. Un divizor propriu al unui numr natural nenul n este
divizor al su diferit de 1 i n. Dac numrul n nu are nici un divizor propriu, atunci parametrii b i c trebuie s fie furnizeze amn
valoarea 0. Dac numrul n are un singur divizor propriu d, atunci parametrii b i c trebuie s fie furnizeze amndoi valoarea lui
Exemplu: pentru a=2334157, valoarea returnat prin b va fi 345. (10p.)

Fiierul text bac.in conine, pe prima linie, cel mult 1000000 de numere naturale nenule, fiecare fiind format din cel mult 9 c
Oricare dou numere consecutive sunt desprite printr-un spaiu.

a) Scriei un program care, folosind un algoritm eficient din punct de vedere al timpului de executare i al spaiului de memorie utili
determin i scrie n fiierul bac.out cel mai mic numr natural care se poate obine din cifrele tuturor numerelor
fiierul bac.in.(8p.)
Exemplu: dac fiierul bac.in conine
numrul10112355577889.

numerele 2117

90

885

515

37, atunci

fiierul bac.out trebuie

con

b) Descriei n limbaj natural metoda utilizat i explicai n ce const eficiena ei. (2p.)

VARIANTA 5 - SUBIECTUL 3 (30p)

ru itemul 1, scriei pe foaia de examen litera corespunztoare rspunsului corect.

Utiliznd metoda backtracking se genereaz, n ordinea cresctoare a valorii, toate numerele formate din exact n cifre aflat
ordine strict cresctoare i avnd prima cifr cel puin egal cu c. Astfel, pentru n=3 i c=5, se obin, n ord
numerele: 567, 568, 569,578, 579, 589, 678, 679, 689 i 789. Folosind aceeai metod, se genereaz numerele form
din n=5 cifre aflate n ordine strict cresctoare i avnd prima cifr cel puin egal cu c=3.
Care va fi al zecelea numr generat? (4p.)
a. 34789

i pe foaia de examen rspunsul pentru fiecare dintre cerinele urmtoare.


Funcia f are definiia urmtoare:

b. 35678

c. 34689

d. 357

bajul Pascal

Limbajul C/C++

criei valoarea care se obine n urma apelului f(100100,1). (3p.)

criei cea mai mare valoare format din 7 cifre pe care o poate avea o variabil n, astfel nct pentru apelul f(n,7) s se ob
area 2. (3p.)

Scriei definiia complet a subprogramului divp, cu 3 parametri, care primete prin intermediul parametrului a un numr nat
cuprins ntre 2 i 1000000000 i furnizeaz prin al doilea parametru b cel mai mic divizor propriu al numrului a, iar prin cel d
treilea parametru c furnizeaz cel mai mare divizor propriu al numrului a. Un divizor propriu al unui numr natural nenul n este
divizor al su diferit de 1 i n. Dac numrul n nu are nici un divizor propriu, atunci parametrii b i c trebuie s fie furnizeze amn
valoarea 0. Dac numrul n are un singur divizor propriu d, atunci parametrii b i c trebuie s fie furnizeze amndoi valoarea lui
Exemplu: pentru a=2334157, valoarea returnat prin b va fi 345. (10p.)

Fiierul text bac.in conine, pe prima linie, cel mult 1000000 de numere naturale nenule, fiecare fiind format din cel mult 9 c
Oricare dou numere consecutive sunt desprite printr-un spaiu.

a) Scriei un program care, folosind un algoritm eficient din punct de vedere al timpului de executare i al spaiului de memorie utili
determin i scrie n fiierul bac.out cel mai mic numr natural care se poate obine din cifrele tuturor numerelor
fiierul bac.in.(8p.)
Exemplu: dac fiierul bac.in conine
numrul10112355577889.

numerele 2117

90

885

515

37, atunci

fiierul bac.out trebuie

con

b) Descriei n limbaj natural metoda utilizat i explicai n ce const eficiena ei. (2p.)

VARIANTA 5 - REZOLVARE - SUBIECTUL 3 (30p)


Se
genereaz
n
maniera
"naintare
numerele: 34567, 34568, 34569, 34578, 34579, 34589, 34678, 34679, 34689,34789, etc.

cu

reven

Pentru rspunsul a) se acord 4p.


a)

Se urmresc apelurile recursive i se fac calculele:


f(100100,1)=1+f(10010,1)=1+1+f(1001,1)=1+1+f(100,1)=1+1+1+f(10,1)=1+1+1+1+f(1,1)=1+1+1+1+0=4
Pentru rspunsul 4 se acord 3p.

b)

n urma apelului f(n,7) se va calcula cte cifre diferite de 7 are numrul n, deci valoarea 2 se va obine dac i numai d

numrul nva fi format din 5 cifre egale cu 7 i dou cifre diferite de 7. Deoarece ne intereseaz cea mai mare valoare posibil a lu
rezult c ambele cifre diferite de 7 trebuie s fie egale cu 9.
Pentru rspunsul 9977777 se acord 3p.

Subprogramul caut, mai nti, cel mai mic divizor propriu d al numrului a. Dac acesta nu exist, atunci parametrii b i c prim
amndoi valoarea 0, altfel parametrul b primete valoarea lui d, iar parametrul c primete valoarea [a/d] (cel mai mare divizo
unui numr se obine mprind numrul respectiv la cel mai mic divizor al su).

Limbajul Pascal

Limbajul C/C++

procedure divp(a:longint; var b,c:longint);


var d:longint;
begin
d:=2;
while((d<=a div 2)and(a mod d <>0)) do
d:=d+1;
if(d>a div 2) then
begin
b:=0;
c:=0;
end
else
begin
b:=d;
c:=a div d;
end;
end;

void divp(int a, int &b, int &c)


{
int d;
d = 2;
while((d <= a/2)&&(a%d!=0))
d++;
if (d>a/2) b=c=0;
else
{
b = d;
c = a/b;
}
}

Pentru respectarea structurii antetului (procedure/void) se acord 1p., pentru declararea corect a parametrului de intare a
1p., pentru declararea corect a parametrilor de ieire b i c nc 1p., pentru declararea variabilelor locale nc 1p., iar pe
respectarea structurii subprogramului i a sintaxei limbajului se acord nc 1p. Corectitudinea algoritmic a prelucrrii n vede
obinerii valorii cerute este notat cu 4p. Pentru transmiterea natural a rezultatului prin parametrii b i c se acord 1p, acea
nsemnnd c valorile lui b i c nu se afieaz i nu se returneaz explicit. n total 10p.
b)

Vom utiliza un vector de frecvene cu 10 elemente fc pentru a contoriza apariiile fiecrei cifre. Vom parcu
fiierul bac.in caracter cu caracter, folosind variabila c de tip char, i, n cazul n care variabila c conine o cifr, vom cre
frecvena sa cu 1. innd cont de faptul c un numr nu poate s nceap cu cifra 0, vom determina cel mai mic numr care se po
forma folosind cifrele tuturor numerelor din fiierul bac.in astfel:

cutm prima cifr nenul cn avnd frecvena cel puin egal cu 1 (sigur exist aceast cifr deoarece numerele
fiierul bac.insunt nenule!), o scriem n fiierul de ieire bac.out i i scdem frecvena cu 1;

ncepnd cu cifra 0, scriem n fiierul de ieire toate cifrele pn la 9, fiecare cifr c fiind scris de un numr de ori ega
frecvena sa fc[c].

Eficiena algoritmului din punct de vedere al timpului de executare const n faptul c parcurgem o singur dat fiierul
intrarebac.in, obinnd astfel un algoritm liniar n raport cu numrul de cifre din fiier. Eficiena algoritmului din punct de veder
memoriei utilizate const n faptul c se va folosi doar un vector de frecvene cu 10 componente, evitnd astfel memorarea tut
celor maximum 9000000 de cifre din fiier ntr-un vector de caractere.
Pentru o descriere coerent a metodei se acord 1p., iar pentru justificarea eficienei, nc 1p. - n total 2p.
a)

Limbajul Pascal

Limbajul C/C++

Se acord 1p. pentru operaiile cu fiiere (declarare, nume corect i deschidere pentru citire), nc 1p. pentru citirea tuturor cifrelor
fiier, 1p. pentru un algoritm corect, nc 2p. pentru determinarea numrului cerut i 1p. pentru corectitudinea formal (declara
variabilelor, structura programului, sintaxa instruciunilor, etc.).
Se acord 1p. pentru alegerea unui algoritm eficient ca timp de executare i 1p. pentru utilizarea eficent a memoriei. n total 8p.

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