Sunteți pe pagina 1din 56

LILIANA STANESCU

ISBN 978-606-577-651-7 Editura Sfntul Ierarh Nicolae 2011

PREFA

Culegerea de fa de a atrage i ajuta elevii n dorin

elor elevilor de a avea o ii, ii i a metodei de

culegere cu probleme explicate i rezolvate. Ea a fo

ii, ct i probleme rezolvate. problemele s-au oferit exemple numerice, explica ii sprijinul utilizatorului. Culegerea este profesorilor ilor, - i aprofundeze cuno tin ele de

RECURSIVITATE Un algoritm se nume te recursiv te subprogram recursiv. Prin urmare un algortim se nume te recursiv sau un program se ine cel pu in un subprogram care se nume

Din afara subprogramului facem un apel al subprogramului condi ie de oprire), algoritmul se autoa ste instruc un lan de autoapeluri recursive. -un ciclu infinit. a de -se ia de oprire nu

ca set de instruc necesitatea existen ei condi iei de oprire. i ii:

i efect u ia unui

apare condi ia de oprire); iei de oprire. Cea mai mare parte a algoritmilor repetitivi se pot implementa ), ct i ntr-o ntrin un modul definit recursiv. sunt definite printr-o rela ie de recuren ie mai mare. n via a de zi cu zi ne putem ntlni cu iruri de elemente definite recurent ca de exemplu: irul numerelor nat ob -se 1)

suma numerelor naturale (ini ial suma este 0; fiecare element elementele aflate naintea lui)

irul lui Fibonacci c.m.m.d.c. dintre 2 numere ia ia, n

Execu instruc iunilor repetitive. Diferen ori de variabilele locale

i parametrii trimi i prin valoare, iar stiva are o

i eliminarea elementelor se poate face 4

n cazul unui subprogram recursiv (care este n acela i timp modul apelat i apelant) acest mecanism al stivei este de o foarte mare importan de autoapeluri recursive, la fiecare autoapel variabilele locale i parametrii subprogramului recursiv se sal

-al n-lea termen din irul lui Fibonacci. 0, dac n 0 1, dac n 1 Fn 1 Fn 2 , dac n

Fn

2 (7) -al aptelea

termen din irul lui Fibonacci. ia: F(7)=F(6)+F(5) F(6)=F(5)+F(4) F(5)=F(4)+F(3) F(4)=F(3)+F(2) F(3)=F(2)+F(1) F(2)=F(1)+F(0) F(1)=1 F(0)=2

Vom calcula mai nti F(2)=1+0=1. tiind ct este F(2) F(3)=F(2)+F(1)=1+1=2. putem

tim ct este F(1) i F(0). calcula pe F(3).

Acum putem calcula i pe F(4)=F(3)+F(2)=2+1=3. Avem toate elementele F(5)=F(4)+F(3)=3+2=5. pentru a calcula i

Ne ntoarcem i la F(6)=F(5)+F(4)=5+3=8. aptelea termen din irul lui Fibonacci: F(7)=F(6)+F(5)=8+5=13. le ajunge la condi ia n cazul n care rezultatele sunt cunoscute, n cazul nostru pentru n=0 i pentru n=1) i apoi se preiau rezultatele intermediare din stiva calculatorului calculnd termenii intermediari.

Probleme rezolvate 1. Scrie ordona Exemplu Rezolvare dac tor. ir cu n elemente este

var i,j,n:integer; x:array[1..100] of integer; procedure citire; begin write('n=');readln(n); for i:=1 to n do begin write('x[',i,']=');readln(x[i]); end; end; function ordon(k:integer):boolean; begin if k=n then ordon:=(x[k]>x[k-1]) else ordon:=((x[k]>x[k-1]) and ordon(k+1)); end; begin citire; write(ordon(2)); end. 2. unui vector cu n elemente (n este dat). Exemplu Rezolvare: n procedura max1 din vector (k este parametru de intrare); la revenire, se maxim, prin compar succesive dintre elementul x[k]. var i,j,n,m:integer; x:array[1..100] of integer; 7 elementul

procedure citire; begin write('n=');readln(n); for i:=1 to n do begin write('x[',i,']=');readln(x[i]); end; end; procedure max1(var max:integer;k:integer); begin if k<n then max1(max,k+1); if x[k]>max then max:=x[k]; end; begin citire; m:=-maxint; max1(m,1); write(m); end. , se verifice dac 3. Folosind o func ntr-un vector cu n elemente numere ntregi. Elementele vectorului, . precum si num rul lor se Exemplu Rezolvare b logic va fi true. var x:array[1..10] of integer; i,b,n:integer; procedure citire; 8 b sau n caz afirmativ, rezultatul

begin write('n=');readln(n); write('b=');readln(b); for i:=1 to n do begin write('x[',i,']=');readln(x[i]); end; end; function ex(k:integer):boolean; begin if k=n then if x[k]=b then ex:=true else ex:=false else if ex(k+1) or (x[k]=b) then ex:=true else ex:=false; end; begin citire; write(ex(1)); end. se construiasc 4. Pentru un ntreg n numere de mai jos, f r a folosi cicluri: n n-1 ... 3 2 1 n-1 n-2 ... 2 1 1 Exemplu: Pentru n=3 se 321 21 1 Rezolvare n procedura linie se elementele de pe o linie, iar n procedura se linie var i,n:integer; 9 recursiv triunghiul de

procedure linie(k:integer); begin if k>=1 then begin write(k:3); linie(k-1); end; end; procedure coloana(l:integer); begin if l>=1 then begin linie(l); writeln; coloana(l-1); end; end; begin write('n=');readln(n); coloana(n); end. 5. s r natural n diferit de 0. Folosind un algoritm recursiv, acest n factori primi. : 45|3 15|3 5|5 k este divizor pentru x, se k ( descomp(n div k, k) ) k, k 10

Exemplu: Pentru n=45 se

Rezovare ul ( descomp(n,k+1) ).

var i,n:integer; procedure descomp(n,k:integer); begin if n>1 then if n mod k=0 then begin writeln(n:3,'|',k); descomp(n div k,k); end else descomp(n,k+1); end; begin write('n=');readln(n); descomp(n,2); end. se realizez area valorilor 6. calculate pentru la nivelul k (citit). Amintim c triunghiul lui Pascal este format din coeficien ii binomului lui Newton . (a+b)n Exemplu: n=4 ; a 11 121 1331 Rezolvare ( afis(l,k+1) ) p : a[l,k]=a[l-1,k-1]+a[lk ajunge la va ek , apoi se

var i,n,j:integer; a:array[1..50,1..50] of integer; 11

procedure afisare; begin for i:=1 to n do begin for j:=1 to i do write(a[i,j]:3); writeln; end; end; procedure afis(l,k:integer); begin if (k<=l) and (l<=n) then begin if (k=1) and (k=l) then a[l,k]:=1 else begin a[l,k]:=a[l-1,k-1]+a[l-1,k]; afis(l,k+1); end; afis(l+1,1); end; end; begin write('n=');readln(n); a[1,1]:=1; a[2,1]:=1;a[2,2]:=1; afis(3,1); afisare; end. r natural este 7. Scrie i o func bine ordonat descresc tor (cifrele sale citite de la stnga la dreapta sunt toare ). Exemplu: Pentru n=8532 se TRUE. 12

Rezolvare: var n,m,i:integer; v:array[1..10] of integer; procedure cifre; begin n:=0; repeat n:=n+1; v[n]:=m mod 10; m:=m div 10; until m=0; end;

rului ntr-

function ordon(k:integer):boolean; begin if k=n then ordon:=(v[k]>v[k-1]) else ordon:=((v[k]>v[k-1]) and ordon(k+1)); end; begin write('m=');readln(m); cifre; write(ordon(2)); end. 8. Scrie palindrom (citit invers se ob Exemplu: Rezolvare (palindrom(i+1) 13 sugus nt dat este i cuvnt). palindrom

i este parametru de intrare). La revenirea din apel se

ntul invers. Da var cuv,pal:string; n:integer; procedure palindrom(i:integer); begin if i<n then palindrom(i+1); pal:=pal+cuv[i]; end; begin write('cuvantul: ');readln(cuv); n:=length(cuv); pal:=''; palindrom(1); if pal=cuv then write('palindrom') else write('nu este palindrom'); end. uite din acelea 9. Dou cuvinte se numesc anagrame dac litere dispuse ntrordine. De exemplu, cuvintele MARA si AMAR i o care, primind ca parametri dou cuvinte, verific dac sunt anagrame. Rezolvare: irurile sunt s1 s2 mul caracter din s2 n s1 ( l:=pos(s2[1],s1) ); terge primul caracter din s2 i caracterul din s1 de pe pozitia l, caracter care coincide cu s2[1] (delete(s2,1,1); delete(s1,l,1) din s2 s2 cuvinte sunt egale. var s1,s2:string; l:integer; a:boolean; 14

procedure cuvinte(s1,s2:string); begin if s2<>'' then begin l:=pos(s2[1],s1); if l=0 then a:=false; delete(s2,1,1); delete(s1,l,1); cuvinte(s1,s2); end; end; begin readln(s1); readln(s2); a:=true; if length(s1)<>length(s2) then a:=false; cuvinte(s1,s2); write(a); end. 10. baza b ( b este dat;1<b<10 ). Exemplu: Pentru n=13 b=2 se r din baza 10 n

Rezolvare baza r n scris n baza 10 se poate ajunge la unul scris iri irile se fac reapelnd procedura pentru ctul (baza(nr div b)) resturile (x este variabil procedurii) var nr,b:integer; procedure baza(nr:integer); var x:integer; 15

begin if nr>0 then begin x:=nr mod b; baza(nr div b); write(x,' '); end; end; begin write('nr=');readln(nr); write('baza:');readln(b); baza(nr); end. 11. Scrie i un program care verifi prim. Exemplu Rezolvare n. ( prim:=prim(n,d+1);) pentru n, atunci num rul nu este prim ( prim:=false; d:=trunc(sqrt(n)+1)). var nr:integer; function prim(n,d:integer):boolean; begin if d=trunc(sqrt(n))+1 then prim:=true else if n mod d=0 then begin prim:=false; d:=trunc(sqrt(n))+1; 16 tre aceste numere este divizor r

end else prim:=prim(n,d+1); end; begin write('n=');readln(nr); write(prim(nr,2)); end. Rezolvare: rului n. var i,n:integer; h:boolean; function prim(d:integer;var h:boolean):boolean; begin if d=n div 2 then prim:=h else begin if n mod d=0 then h:=false; prim:=prim(d+1,h); end; end; begin write('n=');readln(n); h:=true; write(prim(2,h)); end. 12. dat. Exemplu: Pentru n=3524 se 17 ntreg n Apelarea se face

Rezolvare: + suma cifre var n:integer; function suma(n:integer):integer; begin if n=0 then suma:=0 else suma:=suma(n div 10)+n mod 10; end; begin write('n=');readln(n); write(suma(n)); end. 13. S se genereze primii n termeni ai unei progresii geometrice, dac se cunosc primul termen i ra ia. Exemplu: Dac sunt: 3, 6, 12, 24, 48. ia 2 atunci, primii 5 termeni

Rezolvare valoare i p, cu semnifica : p este termenul i i=n ( gen(i+1,p*r) ). var n,r,p:integer; procedure gen(i,p:integer); begin if i<=n then begin write(p,' '); gen(i+1,p*r); end; end;

Se auto

18

begin write('n=');readln(n); write('p=');readln(p); write('r=');readln(r); gen(1,p); end. 14. , caracter cu caracter, ir de caractere. Citirea se ncheie la ntlnirea caracterului '$'. Folosind un algoritm citirii, cifrele car ir. recurs Exemplu: D 755543. Rezolvare c citesc toate caracterele c cifre; ) irul introdus este: as34 a

cifre. n cadrul procedurii . Prin apelurile succesive ale procedurii se (read(c) c ul actual (cel care iese .D

var nr,cod:integer; procedure cifre; var c:char; begin read(c); if c<>'$' then cifre; val(c,nr,cod); if cod=0 then write(c); end; begin cifre; 19

end. 15. dect n ( n este dat ). Exemplu Rezolvare este prim 2. (if n>2 then numere(nprim. var i,n:integer;h:boolean; function prim(d,n:integer;var h:boolean):boolean; begin if d>=n div 2 then prim:=h else begin if n mod d=0 then h:=false; prim:=prim(d+1,n,h); end; end; procedure numere(n:integer); begin if n>2 then numere(n-1); h:=true; if prim (2,n,h) then write(n,' '); end; begin write('n=');readln(N); numere(n-1); end. 20 toate numerele prime mai mici

ste parametru transmis prin )).

16. r n dat. Exemplu Rezolvare var i,n,c:integer;

suma cifrelor pare ale unui

function cifre(n:integer):integer; var c:integer; begin if n=0 then cifre:=0 else begin c:= n mod 10; if c mod 2 =0 then cifre:=c+cifre(n div 10) else cifre:=cifre(n div 10); end; end; begin write('n=');readln(n); write(cifre(n)); end. 17. Scrie dat. Exemplu Rezolvare i . var n:integer; 21 n se face suma ntre i , altfel se face suma ntre rn

function divizor(i:integer):integer; begin if i=n div 2+1 then divizor:=0 else if n mod i=0 then divizor:=i+divizor(i+1) else divizor:=divizor(i+1); end; begin write('n=');readln(n); write(divizor(2)); end. 18. vectori u[n]*v[n]. Exemplu: P -1. care return produsul scalar a doi te n elemente fiecare: u[1]*v[1] + u[2]*v[2] + ... + -3, 1 ,5); v=(1, 1, -1, 0)

Rezolvare produs va lua valoarea sumei dintre u[i]*v[i] i suma ). Produs elementelor ce vor urma. ( i cu 0. ( if i=n+1 then produs:=0 ). type vector=array[1..100] of integer; var n,i:integer; v,u:vector; function produs(i:integer):integer; begin if i=n+1 then produs:=0 else produs:=u[i]*v[i]+produs(i+1); end; 22

procedure citire(var v:vector); begin for i:=1 to n do begin write('elementul: ');readln(v[i]); end; end; begin write('n=');readln(n); citire(u);citire(v); write(produs(1)); end. 19. Pentru un ntreg n dat, s se construiasc triunghiul de numere de a folosi cicluri: n n-1 ........ 3 2 1 n n-1 ........ 3 2 n n-1 .........3 .... n Exemplu: P 432 43 4 Rezolvare var i,n,j:integer; procedure linie(i:integer); begin if i<n then linie(i+1); 23

write(i,' '); end; procedure coloana(j:integer); begin if j<=n then begin linie(j); writeln; coloana(j+1); end; end; begin write('n=');readln(n); coloana(1); end. 20. Exemplu: P te n cifre r natural dat de la tastatur cu suma cifrelor egal cu 5n. 19, 28, 37, 46, 55, 64, 73, 82, 91. p r de n cifre

Rezolvare: suma ncifre transmis ca parametru. ). n procedura generare ( toate numerele de n cifre ( generare(i+1) ) ( if suma(i)=5*n then write(i) ). var n,q:integer; function suma(p:integer):integer; begin if p=0 then suma:=0 else suma:=p mod 10+suma(p div 10); end;

24

function ncifre(j:integer):integer; begin if j=n then ncifre:=1 else ncifre:=ncifre(j+1)*10; end; procedure generare(i:integer); begin if i<q*10-1 then begin if suma(i)=5*n then write(i, ' '); generare(i+1); end; end; begin write('n=');readln(n); q:=ncifre(1); generare(q); end. 21. Exemplu: pentru cuvntul prefix prefi pref pre pr p Rezolvare afisare (copy(s,1,length(s)-1) ). 25

var s:string; n:integer; procedure afisare (s:string); begin if s<>'' then begin writeln(s); afisare(copy(s,1,length(s)-1)); end; end; begin write('s=');readln(s); afisare(s); end. 22. e. Exemplu SUFIX UFIX FIX IX X copierea irului se face Rezolvare ncepnd de la caracterul al doilea (afisare( copy(s,i+1,length(s) ), i). var s:string; n:integer; procedure afisare(s:string;i:integer); begin if s<>'' then 26

begin writeln(s); afisare(copy(s,i+1,length(s)),i); end end; begin write('s=');readln(s); n:=length(s); afisare(s,1); end. 23. Folosind o pro mediane ale unui cuvnt dat. Exemplu CALCULATOR ALCULATO LCULAT CULA UL ele precedente. var s:string; procedure afisare(s:string;n:integer); begin if s<>'' then begin writeln(' ':n+1,s); afisare(copy(s,2,length(s)-2),n+1); end; end; begin 27

write('s=');readln(s); afisare(s,0); end. 24. toate elementele pozitive. Rezolvare: Se compar

var x:array[1..100] of integer; n,i:integer; function v(n:integer):boolean; begin if n=1 then v:=(x[1]>0) else v:=(x[n]>0) and v(n-1); end; begin write('n=');readln(n); for i:=1 to n do begin write('x[',i,']='); readln(x[i]); end; if v(n) then write('Are doar elemente pozitive') else write('Nu are toate elementele pozitive'); end. 25. egale suma factorialelor lor. Exemplu: 145=1!+4!+5! Rezolvare: Func ia fact Procedura suma n programul 28

principal se ver var n,i:integer; s:longint;

care dintre numerele mai mici ca 20000 ndeplinesc

function fact(x:integer):longint; begin if x=0 then fact:=1 else fact:=fact(x-1)*x; end; procedure suma(n:integer;var s:longint); begin if n<>0 then begin s:=s+fact(n mod 10); suma(n div 10,s); end; end; begin for i:=1 to 20000 do begin s:=0; suma(i,s); if s=i then writeln(s); end; end. 26. Exemplu: Pentru n=243 baza este 5. Rezolvare: este cifra+1. 29 baza

var n:integer; function baza(n:integer):integer; var max:integer; begin if n=0 then baza:=0 else begin max:=baza(n div 10); if max<(n mod 10) then baza:=n mod 10; end; end; begin write('n=');readln(n); write(baza(n)+1); end. 27. numere ntregi. Exemplu: Pentru matricea: 1 2 4 3 1 5 3 0 0 6 3 7 9 2 5 4 8 0 1 4 5 6 7 2 3

se va afi a: 1 2 3 4 5 6 7 2 3 4 5 6 0 3 1 4 3 7 8 0 1 2 0 5 9 Rezolvare: Matricea poate fi privit ca un ansamblu de p trate concentrice, fiecare p trat avnd pe laturile sale numere. 12345 4 6 1 7 378 5 0 021 9

30

3 2 06543 Problema se rezum la parcurgerea fiec rui p trat n spiral . Pentru aceasta se folose te procedura spirala. Parametrul k indic num rul p tratului la care s-a ajuns. X se folose te pentru parcurgerea liniei, iar y pentru coloan . - Se parcurge latura superioar a p tratului. X r mne nemodificat, y se modific . Num rul care se afl n col ul din stnga este de forma a[k,k], iar cel din col ul din dreapta a[k,n-k+1]. - Se parcurge latura din dreapta a p tratului. y r mne nemodificat, x se modific . Num rul care se afl n col ul de jos este de forma a[n-k+1,nk+1]. - Se parcurge latura inferioar a p tratului. x r mne nemodificat, y se modific . Num rul care se afl n col ul stnga-jos este de forma a[nk+1,k]. - Se parcurge latura din stnga a p tratului. y r mne nemodificat, x se modific . Se parcurge pn la elementul a[k,k]. Pentru a evita ciclarea l k. infint var a:array[1..20,1..20] of integer; k,x,y,i,j,n,p,l:integer; f:text; procedure spirala(k,x,y:integer); begin if (y<n-k+1) and (x=k) and (l<=k) then begin write(a[x,y]:3); spirala(k,x,y+1); end; if (x<n-k+1) and (y=n-k+1) then begin write(a[x,y]:3); l:=l+1; spirala(k,x+1,y); end; 31

if (y>k) and (x=n-k+1) then begin write(a[x,y]:3); l:=l+1; spirala(k,x,y-1); end; if (x>k) and (y=k) then begin write(a[x,y]:3); l:=l+1; spirala(k,x-1,y); end; end; begin assign(f,'card.txt');reset(f); readln(f,n); for i:=1 to n do begin for j:=1 to n do read(f,a[i,j]); readln(f); end; writeln;p:=1; for k:=1 to n div 2 do begin l:=1; spirala(k,k,k); end; if n mod 2=1 then write(a[n div 2+1, n div 2+1]:3); close(f); end. 28. O persoan are de urcat n trepte. La fiecare pas ea poate urca una sau trepte. S treptele. 32

Exemplu: Pentru n=12 exist

Rezolvare: Presupunem c suntem pe treapta k. S ajungem aici, nainte am fost ori pe treapta k-1 i de acolo am f cut un pas pe treapta urm toare, ori pe treapta k-2 i am f cut un pas de dou treapte. Dac S(k) este num rul de moduri n care se poate ajunge la treapta k, atunci el este egal cu num rul de moduri de a ajunge la treapta k-1, adic s(k-1) plus num rul de moduri de a ajunge la k-2, adic s(k-2). Pe prima treapt se poate ajunge cu un singur pas. Deci S(1)=1. Pe treapta a doua se poate ajunge n dou moduri, deci S(2)=2. Aceast problem este o aplica ie a irului lui Fibonacci. var i,n:integer; function s(k:integer):integer; begin if k=1 then s:=1 else if k=2 then s:=2 else s:=s(k-1)+s(k-2); end; begin write('n=');readln(n); write(s(n)); end. 29. O matrice p tratic A poate fi mp r it de diagonale n 4 zone: nord, sud, est, vest (elementele de pe diagonal nu fac parte din nici o zon ). S se scrie cte o func ie recursiv pentru a calcula: a) suma elementelor din nord din matricea A. b) produsul elemtenlor din vest din matricea A. Elementele matricei, precum i num rul de linii i coloane se vor citi din fi ierul 'card.txt' Exemplu: Pentru n=4 i matricea:

33

1 5 9 13

2 6 10 14

3 7 11 15

4 8 12 16

se ob in: sumaN=5 i produsV=45. Rezolvare: Pentru sumaN: l parcurge liniile de la 1 la (n+1) div 2, k parcurge coloanele de la l+1 la n-l . Pentru produsV: se inverseaza ordinea de parcurgere. var n,i,j:integer; a:array[1..10,1..10] of integer; f:text; function sumaN(l,k:integer):integer; begin if l=n+1 div 2 then suman:=0 else if k<=n-l then suman:=a[l,k]+suman(l,k+1) else suman:=suman(l+1,l+2) end; function produsV(l,k:integer):integer; begin if k=n+1 div 2 then produsv:=1 else if l<=n-k then produsv:=a[l,k]+produsv(l+1,k) else produsv:=produsv(k+2,k+1) end; begin assign(f,'card.txt');reset(f); 34

readln(f,n); for i:=1 to n do begin for j:=1 to n do read(f,a[i,j]); readln(f); end; writeln(suman(1,2)); write(produsv(2,1)); close(f); end.

DIVIDE ET IMPERA n istorie: Expresia Divide et impera este lui Filip al II-lea (rege al Macedoniei (382-336 IC) descriind politica sa asupra ora elor state-grece ti. i te c tigarea i men inerea puterii prin divizarea unei cele care sunt unite, impunndu- i astfel puterea. Aceast ar avea o putere mare. Elementele constitutive acestei strategii sunt: -crearea sau nempotrivirea la formarea unor grupuri mici n rndul popula iei vizate s-ar uni,

35

-ajutarea i dore -promovarea nencrederii i nen elegerilor ntre membrii grupurilor mici -impunerea propriei voin e asupra grupurilor/membrilor unui grup n vederea ob inerii rezultatelor dorite. de rezolvare irea unei probleme n 2 sau mai m separat, apoi se trece la combinarea rezultatelor problemelor rezolvate ob inndu-se, astfel, . solu n informatic La baza problemelor r torul enunt: ir de valori a1 , a2 ,......,an irul se mparte n 2 sau 2 sau mai multe sub sau un rezultat cunoscut. Din aproape n aproape, prin combinarea rezultatelor ob inute, se ob ine rezultatul final. Exemple de probleme rezolvabil -calculul sumei/produsului elementelor unui ir -determinarea minimului/maximului dintr-un ir i termeni din (sunt pare/ sunt prime/ sunt pozitive etc). ):

Algoritmul general al func iei/procedurii metodei Divide et Impera este urm torul: 36

Subprogram DivideEtImpara(inceput, sfr it, rezultat) {nceput-pozi ia primului termen din ir/sub ir; sfr it-pozi ia ultimului termen din ir/sub ir} 1. atunci it,rezultat) altfel 1.2. Divizez_secven a(nceput,sfr it,m) {nu n toate mijloc) 1.3. DivideEtImpera(nceput,m,rezultat1) 1.4. DivideEtImpera(m,sfr it,rezultat2) 1.5. Combin_rezultate(rezultat1,rezultat2,rezultat) Sfr it subprogram De exemplu m suma numerelor de la 5 la 10. -a terminat divizarea irului n unu sau doi termeni>

irul de valori este 5, 6, 7, 8, 9, 10. Pe prima pozi ie n ir este 5, iar pe ultima (pozi ia 6) este 10. nceput=1; sfr it=6. im irul n 2 sub irur pozi ia elementului din mijloc. m=(nceput+sfr it)/2=(1+6)/2=3 37

prin urmare, de exemplu, primul sub ir s1 s 2 (8,9,10) . provenit.

(5,6,7) , iar al doilea este

i irul din care a nceput=1; sfr it=3; mijloc=(1+3)/2=2; Prin urmare ob inem: s11 (5,6) i s12 (7) .

Cele 2 subsiruri au 2 i respectiv 1 element. Pentru s12 (7) suma este 7, prin urmare rezultat12 7.

i irul s11 n 2 sub situa ia cnd irul are 2 termeni, iar solu ia este u or de aflat. Alegem s121 (5) , prin urmare rezultatul sumei elementelor este 5 i rezultat121 5 . s122 (6) , deci suma elementelor din sub ir este 6, iar rezultat122 6 . s12 s121 s122 i ob 5 6 11, deci rezultat12 11;

Din rezultat12 i rezultat11 putem ob ine rezultatul pentru s 1 . rezultat1 rezultat11 rezultat12 11 7 18 .

sirea sumei n irul s 2 . 38

Procednd analog ob inem: rezultat211 8 , rezultat212 rezultat22 10 . Combin rezultat2 rezultat21 9 . Prin urmare rezultat21 17 i

i ob inem: rezultat22 17 10

27 .

Avnd rezultatele rezultat1 i rezultat2 ob inem rezultatul problemei ca suma dintre cele 2 rezultate: rezultat 27 18 45 .

Probleme rezolvate 1. elemente numere ntregi. i minimul dintr-un vector cu n

Exemplu: Pentru n=6 si v=(2 4 3 6 5 1) max=6 si min=1 Rezolvare: Se apeleaz procedura mmax conform metodei divide et impera. La revenirea din apel se compar variabilele locale max1, max2 a mai mare n variabila max (care au fost salvate pe stiv ) i se re n min). (respectiv variabilele locale min1, min2 var a:array[1..100] of integer; min,max,i,n:integer; procedure citire; begin write('n=');readln(n); for i:=1 to n do begin write('a[',i,']=');readln(a[i]); 39

end; end; procedure mmax(p,q:integer;var min,max:integer); var mij,max1,max2,min1,min2:integer; begin if q=p then begin min:=a[p];max:=a[q];end else begin mij:=(p+q) div 2; mmax(p,mij,min1,max1); mmax(mij+1,q,min2,max2); if min1<min2 then min:=min1 else min:=min2; if max1>max2 then max:=max1 else max:=max2; end; end; begin citire; min:=maxint;max:=-maxint; mmax(1,n,min,max); write(min,' ',max); end. 2. ntreg ntr i un num fie mai mici sau cel mult ierul

t toate elementele primului sub ir egale cu x, iar toate elementele celui demari dect x. i

Exemplu: pent (5,7,9).

i v=(1,3,5,7,9)

irurile: (1,3);

40

Rezolvare: Se v n sub iruri, conform procedurii divide et impera pn se ajunge la un sub ir format doar dintr-un element v[p]. Se Dac acesta este mai mic dect x se salveaz n vectorul a, altfel se salveaz n vectorul b. type vector=array[1..10] of integer; var v,a,b:vector; aux,i,j,n,x,k,l:integer; f:text; procedure citire; begin assign(f,'vect.in');reset(f); readln(f,n); for i:=1 to n do read(f,v[i]); close(f); write('x=');readln(x); end; procedure di(p,q:integer); var mij:integer; begin if p=q then begin if v[p]<=x then begin k:=k+1;a[k]:=v[p];end else begin l:=l+1;b[l]:=v[p];end; end else begin mij:=(p+q) div 2; di(p,mij); di(mij+1,q); end; end; begin 41

citire; k:=0;l:=0; di(1,n); for i:=1 to k do write(a[i]:3); writeln; for i:=1 to l do write(b[i]:3); end. un vector cu n elemente numere naturale. Definim plierea donatoare peste receptoare. In cazul n care vectorul are un r impar de elemente, cel din mijloc este eliminat. In acest fel se ii ajunge la un vector n car receptoare. 3. vectorului, Exemplu: Pentru vectorul (1,2,3,4,5) elementele finale sunt: 1,2,4,5. Rezolvare: Dac num rul de elemente din vector (q-p+1) este impar, elementul din mijloc este eliminat , plierea la stnga se va face de la pozi ia (p+q) div 2-1 la 1, iar plierea la dreapta de la pozi ia (p+q) div 2+1 la q. Dac num rul de elemente din vector este par, plierea la stnga ncepe de la pozi ia (p+q) div 2 la 1, iar cea la dreapta de la (p+q) div 2+1 la q. Dac p=q s-a ajuns la elementul final i se afi eaz . var x:array[1..50] of integer; i,j,n:integer; procedure citire; begin write('n=');readln(n); for i:=1 to n do begin write('x[',i,']=');readln(x[i]); end; end; procedure div_imp(p,q:integer); 42

var m:integer; begin if (p=q) then writeln('element final: ',x[p],' ') else begin m:=(p+q) div 2; if (q-p+1) mod 2=1 then begin div_imp(p,m-1); div_imp(m+1,q); end else begin div_imp(p,m); div_imp(m+1,q); end end; end; begin citire; div_imp(1,n); end. ntregi date a1, a2 4. n numere ntregi x1, x2 xn astfel nct cmmdc al numerelor a1, a2 se scrie sub forma: x1*a1+... xn*an. Exemplu: n=6; a=(24, 12, 33, 5, 13, 5) ; dc = 1 ; x=(1,-2,5,-33,2,-5). Rezolvare: Func cmmdc calculeaz cmmdc a dou numere a i b. Func ia dc calculeaz cmmdc al celor n numere a1, a2 n. Pentru fiecare k de la 1 la n-2 se ncearc g sirea a dou numere x[k], x[k+1] astfel nct x[k]*a[k]+x[k+1]*a[k+1]=0. { x[p]:=((a[p]*a[q] div cmmdc(a[p],a[q])) div a[p]); x[q]:=-((a[p]*a[q] div cmmdc(a[p],a[q])) div a[q]);} 43

Se caut cmmmc al celor dou numere. (cmmmc(a,b) este raporul dintre a*b i cmmdc(a,b)). x[p]=cmmmc(a[p],a[q])/a[p] i x[q]=cmmmc(a[p],a[q])/a[q], unde p i q sunt dou pozi ii consecutive. Pentru ultimele dou se caut o combina ie liniar , astfel nct rezultatul fie tocmai divizorul comun al numerelor a1, a2 n. { for j:=1 to a[q-1] do if j*a[q-1] mod a[q]=dc then begin x[q-1]:=j; x[q]:=-(j*a[q-1] div a[q]); break; end; } Procedura se autoapeleaz conform metodei. var a,x:array[1..10] of integer; i,j,n:integer; procedure citire; begin write('n=');readln(n); for i:=1 to n do begin write('a[',i,']=');readln(a[i]); end; end; function cmmdc(a,b:integer):integer; begin while a<>b do if a>b then a:=a-b else b:=b-a; cmmdc:=a; end; function dc:integer; 44

var d,i:integer; begin d:=a[1]; for i:=2 to n do d:=cmmdc(d,a[i]); dc:=d; end; procedure div_imp(p,q:integer); var m:integer; begin if q-p<=1 then begin if q<>n then begin x[p]:=((a[p]*a[q] div cmmdc(a[p],a[q])) div a[p]); x[q]:=-((a[p]*a[q] div cmmdc(a[p],a[q])) div a[q]); end else for j:=1 to a[q-1] do if j*a[q-1] mod a[q]=dc then begin x[q-1]:=j; x[q]:=-(j*a[q-1] div a[q]); break; end end else begin m:=(p+q) div 2; if (m mod 2=0) then begin div_imp(p,m); div_imp(m+1,q); end else begin div_imp(p,m-1); 45

div_imp(m,q); end; end; end; begin citire; div_imp(1,n); for i:=1 to n do write(x[i]:5); end. 5. ntregi.

ionarea elementului x[p] exact pe Rezolvare: Func ia poz realizeaz pozi ia k, pe care ar ocupa-o acesta n vectorul ordonat, astfel nct toate -1] sunt mai mici dect x[k] i toate elementele t x[k]. Aceast func ie folose te doi indec i care ini ial iau valorile p i q. n fiecare moment, unul sau altul dintre ei va indica pozi ia curent ocupat de elementul ini ial (x[p]), n cursul procesul de mutare a sa pe pozi ia k. n dou moduri de lucru: ne constant, iar j scade cu 1 (modi=0;modj=-1) - modi i r te cu 1, iar j r ne constant (modi=1;modj=0). - modj astfel; Functia poz i i j cu q. - Ini - Activeaz modul de lucru modi : a) dac v[i]>v[j] se schimb modul de lucru conform modului de lucru. b) indicatorii ia k. Se re Exemplu: Fie vectorul v=(5,8,4,11,9,14,3,13,1) cu 9 elemente. i=1; j=9; modi de lucru : 5>1 (A) -> v=(1,8,4,11,9,14,3,13,5); se trece la modul i=2; j=9 8>5 (A) -> v= (1,5,4,11,9,14,3,13,8); se trece la modul i=2;j=8

modj modi; 46

5>13 (F) se r mne n modul modi; i=2;j=7 5>3 (A) -> v=(1,3,4,11,9,14,5,13,8); se trece la modul modj; i=3; j=7 ne n modul modj 4>5 (F) -> se r i=4;j=7 11>5(A) -> v=(1,3,4,5,9,14,11,13,8); se trece la modul modi i=4;j=6; ne n modul modi 5>14 -> se r i=4;j=5 5>9 (F) se r mne n modul modi i=4;j=4 i=j deci elementul 5 a fost adus pe pozi ia final pe care o va tor. nd vectorul devine sortat. Algoritmul se repet var x:array[1..10] of integer; i,n,k:integer; procedure citire; begin write('n=');readln(n); for i:=1 to n do begin write('x[',i,']=');readln(x[i]); end; end; function poz(p,q:integer):integer; var i,j,aux,modi,modj:integer; begin i:=p;j:=q;modi:=0;modj:=-1; while i<j do begin if x[i]>x[j] then begin 47

aux:=x[i]; x[i]:=x[j]; x[j]:=aux; aux:=modi; modi:=-modj; modj:=-aux; end; i:=i+modi; j:=j+modj; end; poz:=i; end; procedure div_imp(p,q:integer); begin if p<q then begin k:=poz(p,q); div_imp(p,k-1); div_imp(k+1,q); end; end; begin citire; div_imp(1,n); for i:=1 to n do write(x[i]:3); end. 6. ir de numere x1,x2..xn.

Exemplu: Pentru n=4 i x=( 2,4,82,16) cmmdc=2 Rezolvare: Se folose te o ie cmmdc care returneaz cmmdc a dou numere a i b. Func ia dc dc(m+1,q), apoi combin rezultatele. 48

var x:array[1..10] of integer; i,n,k:integer; procedure citire; begin write('n=');readln(n); for i:=1 to n do begin write('x[',i,']=');readln(x[i]); end; end; function cmmdc(a,b:integer):integer; begin while a<>b do if a>b then a:=a-b else b:=b-a; cmmdc:=a; end; function dc(p,q:integer):integer; var m:integer; begin if (q-p)<=1 then dc:=cmmdc(x[p],x[q]) else begin m:=(p+q) div 2; dc:=cmmdc(dc(p,m),dc(m+1,q)); end; end; begin citire; k:=1; write(dc(1,n)); end. 49

7. Fie un tablou unidimensional neordonat cu n numere ntregi. S n care a . Exemplu: Pentru n=6, x=(3,2,5,3,3,7) i b=3 se afi eaz 1, 4, 5 Rezolvare b pozitia p. var x:array[1..10] of integer; i,n,b:integer; procedure citire; begin write('n=');readln(n); for i:=1 to n do begin write('x[',i,']=');readln(x[i]); end; end; procedure div_imp(p,q:integer); var m:integer; begin if p=q then begin if x[p]=b then write(p:3);end else begin m:=(p+q) div 2; div_imp(p,m); div_imp(m+1,q); end; end; begin write('b=');readln(b); citire; 50 sunt egale se afiseaza

div_imp(1,n); end. 8. se calculeze an i n sunt numere naturale date.

Exemplu: Pentru a=2 i n=5 se ob ine rezultatul 32. irul (1,2..n) Rezolvare: irului. fiecare sub ir, k este lungi var a,n:integer; function div_imp(p,q:integer):integer; var m:integer; begin if p=q then div_imp:=a else begin m:=(p+q) div 2; div_imp:=div_imp(p,m)*div_imp(m+1,q); end; end; begin write('n=');readln(n); write('a=');readln(a); write(div_imp(1,n)); end. 9. din radica se scrie un algoritm care calculea ia sqrt. iruri. Se calculeaz ak pentru

Exemplu: Pentru x=5 se afi eaz 2. Rezolvare: Se 1<[ x ]< x . 51 te inegalitatea fundamental a p r ntregi: x-

var x:integer; procedure divi(s,d:integer); var m:integer; begin if s=d then begin if ((s+1)*(s+1)>=x) and (s*s<x) then write(s); end else begin m:=(s+d) div 2; divi(s,m); divi(m+1,d); end; end; begin write('x='); readln(x); divi(1,x div 2); readln; end. 10. se calculeze valoarea unui polinom P(x) ntr-un punct a dat. P(a)=1.

Exemplu: P(x)=x3+3x2-

Rezolvare: Func ia putere r. Se mparte se ajunge la un sin a la puterea corespunzatoare n-s i se nmul este cu coeficientul v[s]. la suma precedent . type vect=array[1..100] of integer; var x,pol,a,i,n:integer; v:vect; 52

function putere(k:integer):integer; var i,l:integer; begin l:=1; for i:=1 to k do l:=l*a; putere:=l; end; procedure divi(s,d:integer); var m:integer; begin if s=d then pol:=pol+v[s]*putere(n-s) else begin m:=(s+d) div 2; divi(s,m); divi(m+1,d); end; end; begin write('a=');readln(a); write('n=');readln(n); for i:=1 to n do begin write('v[',i,']=');readln(v[i]); end; divi(1,n); write(pol); readln; end.

53

CUPRINS

Prefa Di

.2

54

BIBLIOGRAFIE
Emanuela Cerchez, Marinel S Informatica Polirom,

Manual pentru clasa a X-a Iasi,2000. Informatica manual pentru clasa a X-a si algoritmi a George Daniel Mateescu, Pavel Florin Moraru, Otilia Petrion, Bucuresti, 2000. Aplicatii C si C++ Cornelia Iva Tehnici de programare Aplica ii George Daniel Mateescu, Pavel Florin Moraru Informatic pentru liceu si Bacalaureat

Gimnasium, 2000.

C++ - probleme rezolvate

Materia de clasa a X-

Pascal -

Bucuresti,1998. - Carmen Popescu Donaris, 2003 fundamentali 55 Limbajul Pascal, Algoritmi -Napoca,1999

X-a

Tehnici de programare, varianta Pascal Livia Toca, Andreea Ruxanda Demco, Cristian Informatica Niculescu ABC, 2000. Manual pentru clasa a

Ed. L&S Infomat, 2000.

- http://infoliceu.webnode.com

56

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