ATESTAT - 2003 - 1 - Se citesc numere naturale pn la introducerea a dou numere consecutive egale.
Afiai toate perechile de numere citite consecutiv, care sunt prime ntre ele.
Rezolvare:
Dou numere naturale A i B, diferite de 0, sunt prime ntre ele dac l au pe 1 ca singur divizor
comun. Altfel spus, CMMDC al celor dou numere este egal cu 1. Nu este obligatoriu ca A i B s
fie ele nsele prime. Exemplu: 15 i 16 NU sunt numere prime, dar sunt
prime ntre
ele, pentru c CMMDC (15, 16) = 1.
Conform enunului, dac se citesc numere, nu se tie de la nceput cte (nu se d un n =
numrul de numere ce se vor citi), deci va trebui s le numrm cu un contor i.
Numerele pe care le vom introduce vor fi preluate ntr-un vector X.
Definim o funcie CMMDC pentru a calcula CMMDC al dou numere consecutive (cele dou
numere vor fi dou elemente consecutive din vectorul X).
Program ATESTAT_2003_1_NUMERE_PRIME_INTRE_ELE ;
CONST
nmax = 100;
TYPE
vector = array [1..nmax] of integer;
VAR
x : vector;
n, i : integer;
function CMMDC (A, B : integer) : integer;
var
aux, R : integer;
begin
if A < B then
begin
aux := A;
A := B;
B := aux
end;
R := A MOD B;
while R <> 0 do
begin
A := B;
B := R;
R := A MOD B
end;
CMMDC := B
end; { sfarsit functie CMMDC }
Begin
{ PROGRAM PRINCIPAL }
i := 1;
{contor care numara numerele introduse}
write ('Dati x [ ', i,' ] = ');
{introducem primul numar}
readln (x [i]);
REPEAT
{introducem urmatoarele numere}
i := i + 1;
write ('Dati x [ ', i,' ] = ');
readln (x [i]);
UNTIL ( x [i] = x [i-1] );
{pana ce apar doua numere consecutive egale}
n := i;
{n = total numere introduse = i}
for i := 1 to n - 1 do
begin
if CMMDC ( x [i], x [i+1] ) = 1 then
writeln ( x [i],' si ', x [i+1],' sunt prime intre ele');
ATESTAT - 2003 - 2 - Se citesc numere naturale pn la introducerea unui numr prim cu 12. Afiai
toate numerele care sunt prime cu suma cifrelor lor.
Rezolvare:
Dou numere sunt prime ntre ele dac CMMDC al celor dou numere este 1 (vezi problema anterioar).
Introducem primul numr, notat cu x. Verificm dac x este prim cu 12 i dac DA, oprim algoritmul;
dac nu, verificm dac este prim cu suma cifrelor sale.
Pentru c vom introduce mai multe numere, dar nu tim de la nceput cte anume, introducerea urmtoarelor
numere se va face ntr-un ciclu WHILE.
Definim o funcie CMMDC pentru a calcula CMMDC al dou numere.
Definim o funcie NUMARACIFRE, pentru a numra cifrele unui numr natural.
Definim o procedur DETCIFRE, care determin cifrele unui numr i le depune ntr-un vector.
Definim o funcie SUMACIFRE, care nsumeaz cifrele unui numr.
Program ATESTAT_2003_2_NUMERE_PRIME_CU_SUMA_CIFRELOR_LOR ;
CONST
nmax = 100;
TYPE
vector = array [1..nmax] of integer;
VAR
y : vector;
S, x, n, i : integer;
function CMMDC (A, B : integer) : integer;
var
aux, R : integer;
begin
if A < B then
begin
aux := A;
A := B;
B := aux
end;
R := A MOD B;
while R <> 0 do
begin
A := B;
B := R;
R := A MOD B
end;
CMMDC := B
end; { sfarsit functie CMMDC }
function NUMARACIFRE ( z : integer) : integer;
var
nrcif : integer;
begin
if z = 0 then
nrcif := 1
else
begin
nrcif := 0;
while z > 0 do
begin
z := z DIV 10;
nrcif := nrcif + 1
end;
end;
{ PROGRAM
PRINCIPAL }
else
writeln ('x = ', x,' NU este prim cu suma cifrelor sale S = ', s);
ATESTAT - 2003 - 3 - Fie x un numr natural. Stabilii care este factorul prim care, n descompunerea
lui x, apare la puterea maxim.
Rezolvare:
Notm cu d un posibil divizor al lui x. Evident, d poate lua valori consecutive ncepnd de la 2
pn la x, dar nu orice valoare ntre 2 i x este i divizor al lui x.
Contorul nr numr de cte ori x se mparte exact la un d >= 2.
7
Dup fiecare mprire exact a lui x la d, noul x devine x DIV d. Repetm (ntr-un ciclu WHILE)
aceste calcule att timp ct x > 1.
ATESTAT - 2003 - 4 - Se citesc pe rnd n numere naturale. Afiai-le pe cele care sunt termeni ai
irului lui Fibonacci.
Rezolvare:
Folosim o bucl interioar n care generm un nou termen FIBONACCI, ct timp numrul x
introdus rmne > termenul FIBONACCI generat.
Termenii irului FIBONACCI se rein n vectorul FIBO.
10
{ PROGRAM PRINCIPAL }
write ('Dati nr. de numere naturale, n = ');
readln ( n );
for i := 1 to n do
{bucla exterioar}
begin
write ('Dati x = ');
readln (x);
FIBO [1] := 1;
FIBO [2] := 1;
j := 3;
while x > FIBO [j] do
{bucla interioar}
begin
FIBO [j] := FIBO [j-1] + FIBO [j-2];
j := j + 1
end;
{sfarsit bucla interioar}
if x = FIBO [j] then
writeln ('x = ', x,' este termen FIBO')
else
writeln ('x = ', x,' NU este termen FIBO')
end;
readln
end.
ATESTAT - 2003 - 5 - Se citesc pe rnd n numere naturale. Afiai perechile de numere citite succesiv,
care sunt termeni ai irului lui Fibonacci.
Rezolvare:
Definim funcia VERIFICA, pentru a testa dac un numr este termen FIBONACCI.
Numerele pe care le introducem se vor reine ntr-un vector x.
Pentru introducerea vectorului, definim procedura CITESTEVECTOR.
Program ATESTAT_2003_5_Fibonacci ;
CONST
nmax = 100;
TYPE
vector = array [1..nmax] of integer;
VAR
x, FIBO : vector;
n, i, j : integer;
11
ATESTAT - 2003 - 6 - S se genereze toate numerele de 5 cifre care au doar cifre pare i sunt
divizibile cu 13.
Rezolvare:
Notm cu a, b, c, d, e cifrele numrului x.
12
13
ATESTAT - 2003 - 7 - S se genereze toate numerele de 6 cifre, care au cifrele ordonate descresctor,
prima i ultima cifr fiind impare.
Rezolvare:
Notm cu a, b, c, d, e, f cifrele numrului x.
Definim funcia VERIFICA (x), care determin cifrele lui x si apoi face verificrile impuse de
problem.
Numerele testate sunt cuprinse ntre 987653 i 654321.
Program ATESTAT_2003_7 ;
VAR
x, y, z, t, u, v, w, a, b, c, d, e, f : longint;
function VERIFICA ( z : longint) : BOOLEAN;
begin
f := x MOD 10;
{determinarea cifrelor lui x}
y := x DIV 10;
e := y MOD 10;
z := y DIV 10;
d := z MOD 10;
t := z DIV 10;
c := t MOD 10;
v := t DIV 10;
14
15
{ PROGRAM
PRINCIPAL }
ATESTAT - 2003 - 8 - S se determine toate cuvintele de 5 litere ce conin mcar dou vocale i au a
2-a liter m.
Rezolvare:
Generm cuvintele folosind un ir de caractere cuvant de lungime = 5.
Pe poziia 2 din cuvant va fi ntotdeauna litera m, deci cuvant [2] := 'm'.
Pe celelalte 4 poziii (1, 3, 4, 5) din cuvant vom plasa consoane i vocale. Pentru aceasta, folosim
4 bucle FOR n care contorii de tip CHAR vor fi chiar elementele irului cuvant de pe poziiile
1, 3, 4, 5 (cuvant [1], cuvant [3], cuvant [4], cuvant [5]), care vor lua valori de tip CHAR de la a
la z.
Pentru fiecare poziie din irul cuvant testm dac pe poziia respectiv se afl o vocal i dac
DA, numrm acea vocal, folosind contorul nrvocale.
Dup generarea unei combinaii de vocale i consoane care compun un cuvnt (la sfritul buclei
FOR de la interior), testm dac nrvocale >= 2 i dac DA, numrm cuvntul care satisface
condiiile problemei (majorm contorul i) i afim cuvntul.
La nceputul buclei FOR situate cel mai interior, trebuie s iniializm, de fiecare dat, contorul
care numr vocalele, scriind nrvocale := 0;
Program ATESTAT_2003_8 ;
uses crt;
var
cuvant : string;
i, nrvocale : integer;
Begin
{ PROGRAM
PRINCIPAL }
16
17
ATESTAT - 2003 - 9 - S se afieze toate matricile ptratice n x n care conin pe fiecare linie i
coloan un singur 1, n rest 0.
Rezolvare:
Aceast problem este asemntoare cu problema celor n regine, pe care o vom adapta la
cerinele de mai sus. Asociem unei regine o cifr de 1. Problema reginelor cere s se plaseze n regine pe
o tabl de ah de dimensiune n x n, astfel nct oricare dou regine s nu se atace. Pentru ca dou
regine s nu se atace, ele trebuie s nu fie situate pe aceeai linie, pe aceeai coloan sau pe aceeai
diagonal. La noi, rolul reginelor va fi jucat de elementele egale cu 1 din matricea ptratic n x n. n cazul
problemei noastre, vom renuna la cerina ca elementele matricii egale cu 1 s nu fie plasate pe aceeai
diagonal. Pe fiecare linie trebuie s fie plasat cte o regin. Deci, pentru ca poziia reginelor s fie complet
determinat, este suficient s reinem, pentru fiecare regin, coloana n care este plasat, ntr-un vector
soluie f, de dimensiune n, unde f [i] reprezint coloana n care este plasat regina de pe linia i. Generarea
matricilor n condiiile problemei se face apelnd la un algoritm backtracking.
Observaii:
Notm cu x, respectiv i o linie oarecare i cu f [x], respectiv f [i], coloana pe care se gsete
regina de pe linia x, respectiv linia i.
Condiiile interne:
a). f [x] = 1, 2, ..., n, pentru oricare x = 1, 2, ..., n
b). Dou regine nu pot fi plasate pe aceeai coloan se va exprima analitic astfel:
18
19
n momentul apelrii procedurii, este evident c s-a gsit o soluie pe care o numrm scriind:
Nrsol := Nrsol + 1
i apoi afim Nrsol.
Vom parcurge toate coloanele de la 1 la n. Pentru aceasta avem nevoie de un contor poziional col
care va lua valori de la 1 la n.
n procedur, col este o coloan curent, iar f [lin] este tot o coloan, i anume coloana pe care
se gsete regina de pe linia lin.
Procedura va tipri " * " dac pe coloana curent col exist o regin, adic atunci cnd
col = f
[lin], i va tipri "o" dac aceast condiie nu este satisfcut.
Program ATESTAT_2003_9 ;
uses crt;
const
nrmaxregine = 8; {8 sau alt valoare}
type
vectorsolutie = array [0..nrmaxregine] of 0..nrmaxregine;
var
f : vectorsolutie;
n, x, i : 0 .. nrmaxregine;
ok : boolean;
nrsol : word;
procedure AFISARE;
var
i, j : 0 ..nrmaxregine;
begin
nrsol := nrsol + 1;
writeln;
writeln ('Solutia nr. ',nrsol);
for i := 1 to n do
begin
for j := 1 to n do
begin
if j = f [i] then
write (' 1 ')
else
write (' o ')
end;
writeln;
end;
writeln;
readln
end; { sfarsit procedura }
Begin { PROGRAM PRINCIPAL }
clrscr;
write ('Introduceti numarul de patratele
readln (n);
nrsol:=0;
x := 1;
f [x] := 0;
n = ');
{ virful stivei }
while x > 0 do
{ cit timp stiva nu este vida }
begin
while f [x] < n do
{ cit timp exista valori disponibile }
begin
f [x] := f [x] + 1;
20
21
ATESTAT - 2003 - 10 - S se genereze toate permutrile mulimii {1, 2,... n} cu condiia ca orice
dou numere alturate ale unei permutrii s fie prime ntre ele.
Rezolvare:
Program ATESTAT_2003_10_PERMUTARI ;
uses crt;
const
nmax = 100;
type
vector = array [1..nmax] of integer;
var
f : vector;
sol, n, i : integer;
OK : boolean;
function CMMDC (A, B : integer) : integer;
var
aux, R : integer;
begin
if A < B then
begin
aux := A;
A := B;
B := aux
end;
22
',sol,'
');
for i := 1 to n do
begin
write ( f [i] : 3 )
end;
writeln
end;
procedure PERMUTA ( m : integer );
LABEL
20;
var
k : integer;
CONTIN : boolean;
Begin
{nceput procedur PERMUTA}
k := 1;
f [k] := 0;
while k > 0 do
begin
CONTIN := FALSE;
while f [k] < m do
begin
f [k] := f [k] + 1;
VERIFICA (k, f, CONTIN);
if CONTIN = TRUE then
GOTO 20
end;
20:
if ( CONTIN = TRUE ) AND (k = n) then
23
24
{ PROGRAM
clrscr;
PRINCIPAL }
sol := 0;
write('Dati n = ');
readln (n);
writeln;
PERMUTA (n);
if sol = 0 then
writeln ('Nu exista solutie');
readln
end.
ATESTAT - 2003 - 11 - S se genereze toate variantele de punctaje ce aparin {1, 2,... 10} obinute la
n examene, astfel nct punctajul obinut s fie minim.
Rezolvare:
Generarea combinaiilor de note se face dup algoritmul BACKTRACKING.
Folosim un vector max n care memorm nota maxim obinut la fiecare din cele n examene. Evident,
vectorul max va avea n elemente.
n algoritmul de generare a produsului cartezian din lucrarea amintit, am notat cu f [x] o valoare
numeric dintr-o poziie x. Adaptm aceste notaii la problema noastr: n loc de x notm cu poz
poziia n care se gsete o not n combinaia de note care va fi generat i cu nota [poz], nota de pe
poziia poz. Poziia poz va lua valori de la 1 la n (n = total examene). Evident, nota va fi un vector
cu max [i] elemente, unde i este numrul de ordine al unui examen.
25
26
27
ATESTAT - 2003 - 12 - Afiai numere prime mai mici dect un numr n citit de la tastatur, care
rmn prime i dup ce au fost inversate.
Rezolvare:
Definim o funcie PRIM, cu rezultat de tip BOOLEAN, care testeaz dac un numr este prim.
Definim o funcie INVERS care inverseaz elementele unui ir.
n programul principal, nainte de a inversa un numr x, l transformm mai nti ntr-un ir cu
funcia STR.
Dup inversare, transformm irul obinut ntr-un numr cu funcia VAL.
Testm dac numrul obinut prin inversare este i el prim.
Program ATESTAT_2003_12 ;
uses crt;
var
inversul, sir : string;
a, b, i, x, n, invx : integer;
function PRIM (x : integer ) : boolean;
var
nrdiv, diviz : integer;
begin
nrdiv := 0;
diviz := 1;
while diviz <= x do
begin
if x MOD diviz = 0 then
nrdiv := nrdiv + 1;
diviz := diviz + 1
end;
if nrdiv = 2 then
PRIM := TRUE
else
PRIM := FALSE;
end;
function INVERS (s : string) : string;
var
inv : string;
begin
inv := '';
for i := LENGTH (s) DOWNTO 1 do
begin
inv := inv + s [i]
end;
INVERS := inv ;
end;
Begin
{ PROGRAM
clrscr;
PRINCIPAL }
write('Dati n = ');
readln (n);
writeln;
for x := 1 to n do
begin
STR (x, sir);
28
29
{ PROGRAM
PRINCIPAL }
30
31
32
A i
33
{ PROGRAM PRINCIPAL }
clrscr;
write ('Dati A = ');
readln (A);
writeln;
write ('Dati B = ');
readln (B);
writeln;
clrscr;
for x := A to B do
begin
if PALINDROM (x) = TRUE then
writeln ('x = ', x, ' este PALINDROM');
{ else
writeln ('x = ', x, ' NU este palindrom'); }
{readln;}
end;
readln
end.
ATESTAT - 2003 - 15 - Se citete un vector cu n componente ntregi. Care este cea mai mare sum care
se poate forma cu ele?
Exemplu: n = 4, iar numerele citite sunt 1, 3, 2, -7. Se va tipri 5.
Rezolvare:
Numerele ntregi introduse vor fi reinute ntr-un vector x.
Numerele ntregi introduse pot fi pozitive, negative sau nule. Evident, suma cea mai mare ce se poate
obine din ntregul ir de numere va rezulta prin nsumarea doar a numerelor pozitive.
Notm cu Spoz suma numerelor strict pozitive. ntr-o bucl FOR, vom aduga la aceast sum cte
un termen, doar dac acest termen este strict > 0.
Program ATESTAT_2003_15 ;
uses crt;
34
35
Begin
{ PROGRAM
clrscr;
ATESTAT - 2003 - 16 Interschimbai coloanele unei matrici cu m linii i n coloane astfel nct, n
linia k, elementele s fie ordonate cresctor.
Rezolvare:
Ordonm linia k. n cursul procesului de ordonare, o parte din elementele liniei k se
interschimb ntre ele.
n paralel cu ordonarea, interschimbm i coloanele corespunztoare elementelor de pe linia k
supuse interschimbrilor.
Program ATESTAT_2003_16 ;
uses crt;
VAR
OK, m, n, i, j, k : integer;
A : array [1..100, 1..100] of integer;
aux : integer;
Begin
{ PROGRAM
clrscr;
PRINCIPAL }
write('Dati m = ');
readln (m);
writeln;
write ('Dati n = ');
readln (n);
writeln;
write ('Dati linia
k = ');
36
37
' );
end.
ATESTAT - 2003 - 17 - Se citete un text i o succesiune de caractere. De cte ori ntlnim aceast
succesiune n cadrul textului ?
Rezolvare:
Apelm funcia POS (subir, ir) i determinm poziia unde apare subir n ir.
Dac poziia determinat este <> 0, atunci majorm contorul nrapariii, care numr apariiile
subirului n ir.
De asemenea, dac poziia determinat este <> 0, tergem din irul dat caracterele, de la poziia 1, pe
o lungime = poziia + LENGTH (subir) 1, unde poziia este valoarea determinat cu funcia
POS.
38
39
Cum acest lucru nu este permis de problem, condiia dou regine nu pot fi plasate pe aceeai
diagonal se va exprima astfel:
| f [i] - f [x] | <> | i - x | pentru orice i, x = 1, 2, ..., n
41
n = ');
while x > 0 do
{ ct timp stiva nu este vid nceput algoritm }
begin
{ backtracking }
while f [x] < n do
{ ct timp exist valori disponibile }
begin
42
43
44
poz := 1;
f [poz] := 0 ;
ATESTAT - 2003 - 20 - S se genereze toate irurile de lungime n formate numai din literele A i
M, iruri care s nu aib dou litere A alturate. Numrul n (0 < n < 13) se citete de la
tastatur. Fiecare ir va fi scris pe cte un rnd al ecranului fr spaiu ntre litere.
Rezolvare:
Problema const n generarea produsului cartezian al mulimilor de caractere. Generarea combinaiilor
de litere se face dup algoritmul BACKTRACKING.
Algoritmul de generare a produsului cartezian va genera valori numerice cuprinse ntre 1 i
elementul maxim al unei mulimi implicate n acest produs. Cum pe noi ne intereseaz combinaiile
de litere a i m, vom asocia unui numr din cte o mulime o liter, astfel:
dac f [i] = 1, atunci sir [i] = a
dac f [i] = 2, atunci sir [i] = m.
Nu ne intereseaz dect aceste valori ale lui f [i].
Procedura SCRIE se va apela n mod opional, pentru a observa modul de generare a produsului
cartezian n varianta sa numeric.
Procedura SCRIETEXT va afia doar combinaiile de litere a i m.
Funcia boolean VECINI testeaz dac avem litera a pe dou poziii vecine.
Funcia boolean EXIST verific dac n ir exist i cifra 1. n acest fel se vor elimina
combinaiile care nu-l conin pe 1 (adic acele combinaii de litere care nu conin litera a i care,
deci, nu ne intereseaz).
Vectorul nrelem reine numrul de elemente al fiecrei mulimi din produsul cartezian.
Poz = poziia unui element ntr-o mulime a produsului cartezian.
45
46
47
48
49
Begin
{ PROGRAM
clrscr;
PRINCIPAL }
sol := 0;
write('Dati n = ');
readln (n);
writeln;
PERMUTA (n);
if sol = 0 then
writeln ('Nu exista solutie');
50
51
Program ATESTAT_2003_23_BUBBLE_SORT ;
uses CRT;
const
nmax = 30;
type
vector = array [1..nmax] of integer;
var
a : vector;
i, n : integer;
procedure ORDONEAZA (var x:vector; m:integer);
var
k, j, aux: integer;
begin
repeat
52
53
ATESTAT - 2003 - 24 - Fie A i B doi vectori cu cte m, respectiv n elemente numere ntregi
0, n > 0), ordonai cresctor. S se interclaseze, n vectorul C, vectorii A i B.
Rezolvare:
Program ATESTAT_2003_24_INTERCLASARE ;
uses CRT;
CONST
nmax = 50;
TYPE
vector = array [1..nmax] of integer;
54
(m >
55
m do
:= k + 1;
[k] := A [i];
:= i + 1
WHILE j <= n do
begin
k := k + 1;
56
m = ');
n = ');
57
ATESTAT - 2003 - 25 - Fie X un vector ordonat cu n elemente numere ntregi, n > 0 i elem o
valoare ntreag, citit de la tastatur. S se decid dac elem se gsete n vectorul X, folosind
metoda Divide et Impera.
Rezolvare:
Program ATESTAT_2003_25_Cautare_Binara_Recursiva ;
uses CRT;
type
vector = array [1..20] of integer;
VAR
x : vector;
elem, n, i : integer;
GASIT : boolean; {GASIT = TRUE daca elementul a fost gasit si FALSE daca nu}
procedure CAUTA ( incep, sf : integer; VAR GASIT : boolean );
var
m : integer;
begin
IF incep <= sf then
begin
m := (incep + sf) DIV 2;
if elem = x [m] then
GASIT := true
else
if elem < x [m] then
CAUTA ( incep, m-1, GASIT)
else
CAUTA (m+1, sf, GASIT)
end
ELSE
GASIT := false
end; {sfarsit procedura}
Begin { PROGRAM PRINCIPAL }
CLRSCR;
write ('n = ');
readln (n);
for i := 1 to n do
begin
write ('x [ ',i,' ] = ');
readln (x[i]);
end;
58
ATESTAT - 2003 - 26 - Fie n numere ntregi a1, a2, ... an, cu n > 0. S se determine CMMDC al celor
n numere, prin metoda DEI.
Rezolvare:
Prin metoda DEI (Divide-Et-Impera) se determin CMMDC pentru prima jumtate a vectorului, apoi
pentru cea de-a doua jumtate, dup care vom reuni rezultatele.
Program ATESTAT_2003_26_CMMDC_DEI ;
CONST
nmax = 100;
TYPE
vector = array [1..nmax] of integer;
VAR
x : vector;
C, n, i : integer;
function CMMDC (A, B : integer) : integer;
var
aux, R : integer;
begin
if A < B then
begin
aux := A;
A := B;
B := aux
end;
R := A MOD B;
while R <> 0 do
begin
A := B;
B := R;
R := A MOD B
end;
CMMDC := B
end; { sfarsit functie CMMDC }
function DIVCOM (incep, sf : integer): integer;
{ determina CMMDC prin DEI }
VAR
mij, C1, C2 : integer;
begin
if incep = sf then
DIVCOM := x [incep]
else
begin
59
60
Folosim un vector auxiliar C, n care vom prelua elementele sortate ale vectorului A. Fiecare
element A[i] va fi trecut n C n poziia NR [i] + 1. Pentru exemplul de mai sus, pentru elevul E, NR
[i] = 15, iar poziia pe care trebuie s-o ocupe E n vectorul sortat va fi 16, deci NR [i] + 1.
Program ATESTAT_2003_27_SORTARE_PRIN_NUMARARE ;
uses CRT;
const
nmax = 100;
type
vector = array [1..10] of integer;
var
A: vector;
i, n: integer;
procedure CITIRE (var A: vector; n: integer);
var
i:integer;
begin
for i:=1 to n do
begin
61
62
{ PROGRAM PRINCIPAL }
clrscr;
write ('Dati numarul de elemente ale vectorului, n = ');
readln (n);
CITIRE (A, n);
ORDONARE (A, n);
AFISARE (A, n);
end.
64
x = ');
RESET (f);
{pregatire fisier pentru citire}
Spoz := 0; { initializare suma pozitive }
poz := 0;
while not EOF (f) do
begin
READ (f, v); { citesc o componenta din f }
if v > 0 then
begin
poz := poz + 1;
Spoz := Spoz + v;
end;
end;
if poz > 0 then
begin
Med := Spoz / poz;
writeln ('Media pozitivelor = ', Med);
end
else
writeln ('Nu exista numere pozitive');
readln
end.
65
66
ATESTAT - 2003 - 30 - S se scrie la sfritul fiierului text DIV.TXT toi divizorii naturali ai
numrului ntreg x.
Rezolvare: Folosim algoritmul de verificare a primalitii unui numr ntreg.
Program ATESTAT_2003_30 ;
VAR
f : file of integer;
x, d, diviz : integer;
Begin { PROGRAM PRINCIPAL }
ASSIGN (f, 'C:\DIV.TXT');
rewrite (f);
write ('Dati x = ');
readln (x);
x := ABS (x); {daca x este negativ il facem > 0 }
diviz := 1;
while diviz <= x do
begin
if x MOD diviz = 0 then
67
68
69
70
Varianta 2
Program ATESTAT_2003_31_Bancnote_2_Platile_unei_sume_BackTracking;
type
stiva = array[1..100] of longint;
var
st, a, b: stiva;
n, k, s, i: Longint;
as, ev: boolean;
Procedure Init (k: integer; var st : stiva);
begin
st [k] := -1
End;
Procedure Succesor (var as: boolean; var st: stiva; k: integer);
var
s1, i: longint;
begin
if (st[k] < b[k]) and (k <= n) then
begin
s1 := 0;
for i:=1 to k do
s1 := s1 + st[i] * a[i];
as := (s1 < s)
end
else
as := false;
if as then
st[k] := st[k] + 1
End;
Procedure Valid (var ev: boolean; st: stiva; k: integer);
var i: integer;
begin
ev := true
End;
Function Solutie( k:integer): boolean;
var i, s1: longint;
begin
s1 := 0;
for i := 1 to k do
s1 := s1 + st[i]*a[i];
solutie := (s=s1)
End;
Procedure Scrie;
var i: integer;
71
72
{ PROGRAM PRINCIPAL }
n := 4;
a[1] := 1000;
a[2] := 5000;
a[3] := 10000;
a[4] := 100000;
write ('Suma = ');
readln (s);
for i := 1 to n do
begin
b[i] := s div a[i]
end;
k := 1;
Init (k, st);
while (k > 0) do
begin
repeat
succesor (as, st, k);
if as then
valid (ev, st, k);
until (not as) or (as and ev);
if as then
if solutie (k) then
SCRIE
else
begin
k := k+1;
init (k, st);
end
else
k := k-1
end;
readln
END.
ATESTAT - 2003 - 32 - S se parcurg, prin sritura calului, o tabl de ah, netrecnd de dou ori prin
aceleai poziii sau omind o anumit poziie.
Rezolvare:
Program ATESTAT_2003_32_SARITURA_CALULUI ;
uses CRT;
CONST
mmax = 8; { nr. de linii }
nmax = 8; { nr. de coloane }
TYPE
73
74
readln;
nrsol := nrsol + 1;
writeln ('Solutia ', nrsol, ' : ');
writeln;
for i := 1 to m do
begin
for j := 1 to n do
begin
write ( ' ', SOL [i, j] : 3,' ');
end;
writeln;
writeln;
end;
readln;
CLRSCR
end; { sfarsit procedura SCRIE }
procedure TRASEU (i, j, pas : integer);
begin
IF (i IN [1..m])
AND (j IN [1..n]) then
begin
if SOL [i, j] = 0 then
begin
SOL [i, j] := pas ;
if pas = m * n
then
SCRIE
else
begin
TRASEU (i-2,
TRASEU (i-1,
TRASEU (i+1,
TRASEU (i+2,
TRASEU (i+2,
TRASEU (i+1,
TRASEU (i-1,
TRASEU (i-2,
end;
SOL [i, j] := 0;
end;
75
j+1,
j+2,
j+2,
j+1,
j-1,
j-2,
j-2,
j-1,
pas
pas
pas
pas
pas
pas
pas
pas
+
+
+
+
+
+
+
+
1
1
1
1
1
1
1
1
);
);
);
);
);
);
);
);
76
Begin
END.
77
78
79
{end WHILE}
80
Varianta 2:
Program ATESTAT_2003_33_Parcurgere_graf_in_latime_cu_procedura_recursiva ;
type mat = array [1..20, 1..20] of integer;
vect = array [1..20] of integer;
var v : mat;
t, coada : vect;
n, k, j, i, p : integer;
{ PROGRAM PRINCIPAL }
write('n = ');
readln(n);
for i := 1 to n do
begin
t[i] := 0;
for j := i+1 to n do
begin
write ('Legatura intre ',i,' si ',j,' = ');
readln (v[i,j]);
v[j,i] := v[i,j];
end;
end;
write ('Dati Nodul de plecare, p = ');
readln (p);
coada [1] := p;
t[p] := 1;
k := 1;
PBF (p);
for i:=1 to n do
write (coada[i],'->');
writeln;
81
82
ATESTAT - 2003 - 34 - S se determine un ciclu ntr-un graf astfel nct s se treac prin toate
punctele grafului, iar costul drumului s fie minim.
Rezolvare: Se folosete algoritmul cunoscut de determinare a unui ciclu ntr-un graf.
Program ATESTAT_2003_34_Graf_cost_minim ;
var
A: array [1..20,1..20] of integer; {matricea de adiacenta}
s: array [1..20] of integer;
n, i, j, v, v1, v2, min, cost: integer;
Begin
{ PROGRAM PRINCIPAL }
Write ('Dati numarul de noduri, n = ');
Readln (n);
writeln (Dati matricea de adiacenta A);
for i := 1 to n - 1 do
for j := i + 1 to n do
begin
write ('Dati A [ ', i, ', ',j,' ] = ');
readln ( A [i, j]);
A [j, i] := A [i, j]
end;
for i:=1 to n do
begin
S [i] := 0;
{matricea de adiacenta este patratica, avand toate}
A [i, i]:= 0
{elementele diagonalei principale egale cu zero }
end;
write ('Dati Nodul de pornire, v = ');
readln (v);
S [v] := 1;
v2 := v;
cost := 0;
writeln (v);
for i := 1 to n-1 do
begin
min := 30000;
for j := 1 to n do
if (A [v2, j] <> 0) and ( S [j] = 0) and ( min > A [v2, j]) then
begin
min := A [i, j];
v1 := j
end;
v2 := v1;
S [v2] := 1;
cost := cost + min;
write (v1, ' -> ');
end;
cost := cost + A [v2, v];
writeln (v);
writeln ('Cost total = ',cost);
readln
end.
83
84
85
{ PROGRAM PRINCIPAL }
clrscr;
assign (SOLUTII, 'C:\SOLUTII.txt');
{Solutiile se vor scrie si in fisierul C:\SOLUTII.TXT}
rewrite (SOLUTII);
sol := 0;
1 2 4 3
write('Dati nr. de melodii ( < 10 )
n = ');
1 2 5 4
readln (n);
write ('Dati melodia nr. x = ');
1 4 3 2
readln (x);
1 4 3 5
write ('Dati melodia nr. y = ');
1 5 2 4
readln (y);
writeln;
PERMUTA (n);
if sol = 0 then
writeln ('Nu exista solutie');
readln
end.
De exemplu, pentru n = 5
X=3
Y=4
se vor afia pe ecran
(respectiv se vor scrie n fiierul C:\SOLUTII.TXT)
soluiile:
86
1
2
2
2
2
2
2
4
4
4
4
4
4
5
5
5
5
5
5
1
1
4
4
5
5
3
3
3
3
3
3
1
1
2
2
4
4
4
5
3
3
1
4
1
1
2
2
5
5
2
4
1
4
3
3
3
4
1
5
4
3
2
5
1
5
1
2
4
3
4
3
2
5
3
5
2
3
2
5
3
5
1
3
1
5
2
5
1
2
1
3
2
3
1
1
87