Sunteți pe pagina 1din 14

Divide et impera este o metoda general de elaborare a algoritmilor.

n
cadrul acestei metode distingem trei etape:
Descompunerea problemei ce trebuie rezolvat n dou sau mai multe
subcazuri (subprobleme) mai mici ale aceleiai probleme.
Rezolvarea succesiv a fiecrui subcaz.
Recompunerea succesiv a soluiilor obinute penru fiecare subcaz n vederea
determinrii soluiei problemei iniiale
7. Metoda de programare Divide et Impera
7.1 Prezentare general
! ne imaginm c dorim s cutm un cuv"nt n dicionarul e#plicativ. Dup
cum tim n dicionar cuvintele sunt ordonate alfabetic.
$resupunem c dorim s tim ce nseamn cuv"ntul %paradigm&. Desc'idem
dicionarul la nt"mplare. (m desc'is la litera %)& nu am a*uns la cuv"ntul cutat dar
tim c el se afl undeva n partea dreapt a dicionarului fa de litera %)& nu este
necesar s mai cutm n tot dicionarul desc'idem i constatm c am a*uns la litera
%!& de data aceasta tim c trebuie sa cutm n dicionar puin mai la st"nga fa de
litera %!&. Repetm aceti pai p"n ce vom gsi cuv"ntul cutat.
$rin urmare am avut o carte mare n care trebuia s cautm un cuv"nt nu am
cutat cuv"nt cu cuv"nt de la nceputul crii deoarece aceast operaiune ar fi durat
foarte mult dar mai ales ne+am fi plictisit i am fi renunat s aflm ce nseamn
cuv"ntul %paradigm&. ,um am procedat-
(m mprit cartea n dou pri urm"nd s decidem n care parte vom cuta
mai departe. De*a problema s+a mai simplificat pentru c nu mai aveam de cutat
ntr+o carte at"t de mare. Dac nc nu am gsit am mprit din nou aceast parte a
crii n dou pri mai mici n care cutm mai uor i aa mai departe.
$rin urmare am mprit problema dificil n subprobleme mai simple am
repetat operaiunea p"n c"nd am a*uns la subprobleme suficient de simple pe care le
putem rezolva cu usurin.
!e poate spune c este o metod puternic de rezolvare a unor probleme
conceptual dificile ca de e#emplu .urnurile din /anoi generarea fractalilor puzzle i
altele.
0n mod natural metoda divide et impera se implementeaz recursiv dar este posibil
s eliminm recursivitatea printr+un ciclu iterativ.
Compararea implementrii recursive cu cea iterativ
0mplemantarea iterativ poate fi mai rapid i economisete memorie deoarece nu
se fac reapelri succesive de funcii cre"ndu+se noi niveluri de stiv. .otui recompunerea
soluiei problemei iniiale din soluiile subproblemelor poate fi dificil n cazul implementrii
iterative.
1
7.2 Exemple de implementare a metodei:
1. D"ndu+se un ir ordonat cresctor de n numere ntregi i un numr ntreg x s se
determine dac numrul x apar!ine irului i poziia pe care se gsete n ir.
2om cuta numrul # doar n mi*locul irului.
Dac nu l gsim av"nd n vedere faptul c irul este ordonat cresctor vom cuta
numrul # n continuare doar n *umtatea n care ar putea s e#iste.
(ceast rezolvare a problemei cutrii unui numr ntr+un ir ordonat de numere este
cunoscut i sub denumirea de cutare "inar.
Descrierea algoritmului:
!e citete irul ntr+un tablou unidimensional a. 3otm cu li limita inferioar a irului
(indicele cel mai din st"nga) cu ls limita superioar a irului (indicele cel mai din dreapta)
i cu m indicele din mi*locul irului.
Dac li #$ ls nseamn c n ir mai sunt elemente printre care trebuie sa+l cutm pe
#. Determinm m$%li&ls'(2 indicele din mi*locul irului.
)eri*icm daca elementul de pe pozi!ia m este c+iar x.
dac da funcia se termin return"nd poziia m pe care se gsete #
altfel se verific dac x#a,m-
atunci se reapeleaz funcia pentru subsirul cuprins ntre li i ls$m .1
altfel se reapeleaz funcia pentru subsirul cuprins ntre li$m & 1 i ls.
Dac li/ls nseamn c # nu se gsete n ir iar funcia returneaz .1.
0mplementarea recursiv a pro"lemei:
2
#include<iostream.h> //CUTAREA BINAR
const MAX=20;
int a[MAX];
int cauta(int li,int ls,int x);
void main()
{ int n,m,;
cout<<!n=!;cin>>n; "" se cite#te n$num%rul de elemente al #irului
&or'int i=0;i<n;i(()
{cout<<!a[!<<i<<!]=!; cin>>a[i];* ""se citesc elementele #irului
cout<<!=!;cin>>; ""se cite#te elementul cautat x
m=caut%'0,n$1,); ""a+elul &unc,iei cauta
i& 'm-= $1)
cout<<<<! se .aseste +e +o/itia !<<m; ""indicele elementului 0n #ir
else
cout<<<<! nu se .aseste in sir!; ""dac% &unc,ia returnea/% 11, nu se .%se#te 0n #ir
*
int cauta(int li,int ls,int x) // li-limita in&erioara a #irului, ls$limita su+erioar% a #irului
{int m;
i&'li<=ls)
{m='li(ls)"2; "" m-indicele din mi2locul #irului
i& '==a[m]) ""se com+ar% cu elementul din mi2locul #irului
return m; ""returnea/% indicele elementului de ta3lou, unde se .%se#te
else
i& '<a[m]) ""se com+ar% cu elementul din mi2locul #irului
return cauta'li,m$1,); ""dc% este mai mic dec4t elementul din mi2loc, se 5a c%uta 0n
else ""continuare 0n 2um%tatea st4n.% a #irului
return cauta'm(1,ls,);* ""0n ca/ contrar se caut% 0n 2um%tarea drea+t% a #irului
else return $1; ""dac% nu mai a5em unde c%uta, 0nseamn% c% nu se .%se#te 0n
* ""#ir
0mplementarea iterativ a *unc!iei cauta:
4.. !e citete un ir de n numere ntregi. ! se determine elementul ma#im din ir.
2om aplica metoda divide et impera astfel: irul iniial l mprim n dou
subiruri apoi le mprit pe acestea n alte dou subiruri i aa mai departe p"n
c"nd a*ungem la un singur element.,u siguran dac un ir conine un singur
element este foarte simplu s spunem care este cel mai mare element al irului.
0at c mprind irul am a*uns la probleme suficient de simple pe care s le
rezolvm cu mare uurin.
Dup ce determinm ma#imul pe fiecare subir recompunem soluiile pentru a
determina n final ma#imul irului iniial.
5#emplu: 6ie iul 7 8 9 : ; < =
6
int cauta(int li,int ls,int x) // li-limita in&erioara a #irului, ls$limita su+erioar% a #irului
{int m;
7hile 'li<=ls) ""at4ta tim+ c4r li < ls 0nseamn% c% 0n #ir mai sunt elemente
{ ""+rintre care tre3uie sa$l c%ut%m +e .
m='li(ls)"2; "" m-indicele din mi2locul #irului
i&'==5[m]) ""se com+ar% cu elementul din mi2locul #irului
return m; ""returnea/% indicele elementului de ta3lou, unde se .%se#te
i&'<5[m])
ls=m$1; ""dc% este mai mic dec4t elementul din mi2loc, se modi&ica ls
else
li=m(1; ""0n ca/ contrar se modi&ic% li
*
return $1; ""dac% nu a &ost .%sit, &unc,ia returnea/% $1
*

6 8 9 : ; < =
6 8 9 : ; < =
6 8 9 : ; < =
8 9 : ; < =
8 : =
8 :


:
Decrierea algoritmului:
3otm cu li indicele reprezent"nd limita inferioar a subsirului i cu ls indicele
reprezent"nd limita superioar a irului.
Determinm indicele m din mi*locul irului.
6olosim dou variabile a n care vom pstra ma#imul subsirului st"ng (de la li la
m) i " n care vom pstra ma#imul subirului drept (de la m&1 la ls).
6uncia se reapeleaz p"n c"nd fiecare subir va conine un singur element.
(cest element l considerm ca fiind ma#imul pentru subirul respectiv.
,omparm ma#imele astfel obinute pntru fiecare subir rein"ndu+se cel mai
mare dintre ele.
7. !uma ma#im n triung'i.
6ie un trung'i cu n linii (1>?n>?1@@). $e fiecare linie i se gsesc i numere
ntregi.
! se determine cea mai mare sum fotmat din numere aflate pe un drum
ntre numrul de pe prima linie i un numr de pe ultima linie.
6iecare numr de pe acest drum este situat sub precedentul la st"nga sau la
dreapta acestuia.
<
#include<iostream.h> //!A"I!
const MAX=20;
int 5[20],n;
int maxim(int li,int ls);
void main()
{int i;
cout<<!n=!;cin>>n;
&or'i=0;i<n;i(()
{cout<<!5[!<<i<<!]=!;cin>>5[i];*
cout<<!elem. maim=!<<maim'0,n$1);
*
int maxim(int li,int ls) //li-limita in&erioara, ls$limita su+erioara
{int m,a,3;
i&'li==ls) ""dac% su3sirul con,ine un sin.ur element, acela este
maimul
return 5[li];
else
{m='li(ls)"2; ""determinam indicele din mi2locul #irului
a=maim'li,m); "" a, 5a con,ine maimul +e su3#irul st4n.
3=maim'm(1,ls); ""3, 5a con,ine maimul +e su3#irul dre+t
i& 'a>3) "" +e &iecare ni5el de sti5% se com+ar% maimele o3,inute #i
return a; ""se returnea/% cel mai mare dintre ele
else
return 3;
*
*
5#emplu: pentru n? <
9
< @
7 ; 4
4 8 : =
9
=
#include <iostream.h> //#U!A !A"I!A
#de&ine MAX 101
int t[MAX][MAX],n; ""n$nr. linii, t$memorea/% elementele triun.hiului
void citi$%();
void a&isa$%();
int sumamax(int i,int ');
void main()
{citire');
a&isare');
cout<<!suma maima=!<<sumama'1,1);
*
void citi$%() ""cite#te elementele triun.hiului
{int i,2;
cout<<!n=!;cin>>n;
&or 'i=1;i<=n;i(()
&or'2=1;2<=i;2(()
{cout<<!t[!<<i<<!,!<<2<<!]=!; cin>>t[i][2]; *
*
void a&isa$%() ""a&i#ea/% elementele triun.hiului
{int i,2,+;
+='n$1)"2;
&or'i=1;i<=n;i(()
{&or '2=1;2<=n$+; 2(() cout<<! !;
&or '2=1;2<=i;2(() cout<<t[i][2]<<! !;
cout<<endl;
+=+(1;
*
*
int sumamax(int i,int ') ""calculea/% suma maim% a elementelor din triun.hi
{int a,3; ""a$re,ine suma +e st4n.a, 3$re,ine suma +e drea+ta
i&'i<=n)
{a=sumama'i(1,2);
3=sumama'i(1,2(1);
i&'a>3) ""decidem care sum% este mai mare
return t[i][2](a; ""adun% elementul triun.hiului la suma cea mai mare
else
return t[i][2](3;
*
return 0;
*
<. .urnurile din /anoi
6ie trei ti*e i n discuri cu diametre distincte. 3otm ti*ele cu literele ( ) ,.
,ele n discuri se afl toate pe ti*a ( aezate n ordinea descresctoare a diametrelor.
!e cere s se mute cele n discuri de pe ti*a ( pe ti*a ) folosind drept ti* de manevr
ti*a , astfel:
- la un moment dat se mut un singur discA
- niciodat un disc de diametru mai mare nu se afl peste un disc de diametru
mai mic.
exemplu:
pentru n$1 ( )
pentru n$2 ( ,
( )
, )
pentru n$1 + se muta 4 discuri de pe ( pe , folosind ca manevra ti*a ) la fel ca mai
sus
+ se mut discul 7 de pe ( pe )
+ se aduc cele 4 discuri de pe , pe ) folosind ca manevr ti*a ( la fel ca
mai sus
.........................................................................................................................................
pentru n discuri:
+ se muta n21 discuri de pe ( pe , folosind ca manevra ti*a ) la fel ca
mai sus
+ se mut discul n de pe ( pe )
+ se aduc cele n21 discuri de pe , pe ) folosind ca manevr ti*a ( la fel
ca mai sus
8
#include<iostream.h> "/(AN)I
5oid hanoi'int n,char a,char 3,char c);
void main()
{int n;
cout<<!n=!; cin>>n; ""n$num%rul de discuri
hanoi'n,>A>,>?>,>@>); ""a+elul &unc,iei hanoi nu +arametri nr. discuri #i cele 6 ti2e
*
void *anoi(int n,c*a$ a,c*a$ +,c*a$ c) ""n$nr.discuri,a,3,c$cele trei ti2e
{i& 'n==1)
cout<<a<<!$>!<<3<<endl; ""se mut% discul 1
else
{hanoi'n$1,a,c,3); ""se mut% n$1 discuri de +e ti2a A +e @ &olosind dre+t mane5ra ti2a ?
cout<<a<<!$>!<<3<<endl; ""se mut% discul n de +e A +e ?
hanoi'n$1,c,3,a); ""se mut% n$1 discuri de +e ti2a @ +e ? &olosind dre+t mane5ra ti2a A
*
*

9. ! se determine cel mai mare divizor comun al unui ir de n numere naturale.
2om mpri irul n dou subiruri apoi fiecare subir n alte dou subiruri mai
mici p"n c"nd subirurile astfel obinute vor conine cel mult dou elemente.
$entru aceste elmente vom aplica algoritmul lui 5uclid de determinare a celui
mai mare divizor comun.
Recompunem apoi soluiile astfel obinute pentru a determina cel mai mare
divizor comun al tuturor elementelor din irul iniial.
=. !e citesc n numere naturale. ! se determine suma numerelor prime ale irului.
,onform strategiei metodei divide et impera vom mpri problema n
subprobleme mai simple de acelai tip p"n c"nd devin suficient de simple pentru
a le rezolva. (poi recompunem soluiile. $entru aceasta vom proceda astfel:
Determinm elementul din mi*locul irului.
Dac este un numr prim l adunm la suma elementelor prime din subirul din
st"nga lui i la suma elementelor prime din subirul din dreapta lui.
Dac nu este prim vom aduna doar cele dou sume obinute din subirul st"ng
i subirul dept.
;
#include<iostream.h> //C!!,C
const MAX=20;
unsi.ned 5[MAX],n;
unsi-n%d cmmdc(unsi-n%d li,unsi-n%d ls);
unsi-n%d %uclid(unsi-n%d a,unsi-n%d +);
void main()
{int i;
cout<<!n=!;cin>>n; ""n$num%rul de elemente ale #irului
&or'i=0;i<n;i(() ""se citesc elementele #irului
{cout<<!5[!<<i<<!]=!;cin>>5[i];*
cout<<!cmmdc=!<<cmmdc'0,n$1);
*
unsi-n%d cmmdc(unsi-n%d li,unsi-n%d ls) //li-limita in&erioar% a #irului, ls-limita su+erioar% a
{ unsi.ned m; "" #irului
i& 'ls$li<=1) ""dac% 0n #ir eist% cel mult dou% elemente
return euclid'5[li],5[ls]); ""se determin% cmmdc cu al.oritmul lui Auclid
m='li(ls)"2; ""m- mi2locul #irului
return euclid'cmmdc'li,m),cmmdc'm(1,ls)); ""a+elul &unc,iei euclid +enru cele dou% su3#iruri
*
unsi-n%d %uclid(unsi-n%d a,unsi-n%d +) //euclid determin% cmmdc a doua numere
{unsi.ned r;
7hile '3) ""c4t tim+ 0m+%r,itorul este di&erit de 0
{r=aB3; a=3; 3=r; ""se calculea/% restul #i de0m+%r,itul de5ine
* "" 0m+%rtitorul iar 0m+%r,itorul de5ine restul
return a; ""se returnea/% ultimul rest di&erit de 0
*
$entru cele dou subiruri se reapeleaz funcia recursiv relu"ndu+se astfel
algoritmul p"n c"nd n subirurile astfel obinute nu mai e#ist nici un element.
8. !ortarea prin interclasare
!e citete un vector cu n numere ntregi. ! se ordoneze cresctor prin interclasare.
(lgoritmul de interclasare a doi vectori a fost prezentat n manualul clasei a 1@+
a.
(v"nd dou iruri de valori ordonate cresctor unul cu n elemente iar cellalt
cu m elemente putem obine un ir cu toate valorile ordonate cresctor.
:
#include <iostream.h> "/#U!
#include <math.h>
#de&ine MAX 20
int a[MAX],n; ""a$memorea/% #irul de numere, n-nr.de elemente ale #irului
int suma(int li,int ls);
int %./$im (int 0,int d1);
void main()
{int i;
cout<<!n=!;cin>>n; ""cite#te nr. de elemente
&or'i=0;i<n;i(() ""cite#te elementele #irului
{cout<<!a[!<<i<<!]=!;cin>>a[i];
*
cout<<!suma elementelorC!<<suma'0,n$1); ""a+elea/% &unc,ia suma
*
int suma(int li,int ls) //li-limita in&erioar% a #irului, ls$limita su+erioar%
{int m,,D; ""m,,D$5aria3ile locale
i&'li<=ls)
{m='li(ls)"2; ""m$re,ine indicale din mi2locul #irului
=suma'li,m$1); ""$re,ine suma calculat% +e su3#irul din st4n.a
D=suma'm(1,ls); ""D$re,ine suma calculat% +e su3#irul din drea+ta
i& 'eE+rim'a[m],2)) ""e_prim-5eri&ic% daca num%rul a[m] este +rim
return a[m]((D; ""dac% este +rim se adun% la sumele de +e su3#iruri
else
return (D; ""dac% nu este +rim se adun% numai sumele de +e su3#iruri
*
else
return 0; * ""dac% nu mai sunt elemente 0n #ir
int %./$im (int 0,int d) //0-num%rul de 5eri&icat, d$cu 5aloare ini,ial% 2
{i&'F==0GGF==1) ""0 #i 1 nu sunt numere +rime
return 0;
i&'d>sHrt'F)) ""condi,ia de o+rire a al.oritmului recursi5
return 1;
else
i&'FBd==0) ""se 5eri&ic% dac% num%rul se di5ide la F
return 0;
return eE+rim 'F,d(1); ""rea+elul &unc,iei
*
$roblema noastr conine doar un ir neordonat.
,onform metodei divide et impera vom mpri problema n subprobleme de
acelai tip p"n c"nd devin suficient de simple pentru a le rezolva. Rezolvm aceste
probleme apoi recompunem soluiile lor.
$entru a ordona vectorul l vom mpri n doi vectori vom mpri aceti doi
vectori fiecare n c"te doi vectori i aa mai departe p"n c"nd vectorii obinui vor
avea cel mult dou elemente. $entru astfel de vectori ordonarea este foarte simpl
vom intersc'imba elementele lor dac este cazul. (poi vom interclasa r"nd pe r"nd
vectorii n ordinea invers obinerii lor.
10
#include <iostream.h> //#)RTARE 2RIN INTERC3#ARE
#de&ine MAX 20
int a[MAX], n;
void div.im/(int li, int ls);
void so$ta$%(int li, int ls);
void int%$clasa$%(int li, int ls, int m);
void citi$%();
void a&isa$%();
void main()
{int i;
citire');
a&isare');
di5Eim+'0,n$1);
a&isare');
*
void citi$%() "" cite#te n #i elementele #irului
{int i;
cout<<!n=!;cin>>n;
&or'i=0;i<n;i(()
{cout<<!a[!<<i<<!]=!; cin>>a[i]; *
*
void a&isa$%() ""a&i#ea/a elementele #irului
{int i;
&or'i=0;i<n;i(() cout<<a[i]<<! !;
cout<<endl;
*
void div.im/(int li, int ls) "".%se#te mi2locul #i 0m+arte #irul 0n su3#iruri +4n% c4nd
{int m; "" se a2un.e la cel mult dou% elemente 0n &iecare su3#ir
i&''ls$li)<=1)
sortare'li,ls); ""ordonea/% #u3#irurile &ormate din cel mult dou% elemente
else
{m='li(ls)"2; ""mi2locul #irului
di5Eim+'li,m); ""rea+elarea &unc,iei +e su3#irul st4n.
di5Eim+'m(1,ls); ""rea+elarea &unc,iei +e su3#irul dre+t
interclasare'li,ls,m);* ""terclasea/% su3#irurile ordonate
*
void so$ta$%(int li, int ls)
{int au;
i&'a[li]>a[ls]) ""interschim3% elementele #irului dac% nu sunt 0n ordinea dorit%
{au=a[li];
a[li]=a[ls];
a[ls]=au; *
*
;. !ortarea rapid
1
(BuicC !ort).
6iinddat un ir cu n elemente numere ntregi sortm elementele irului dup
urmtorul algoritm: selectm un prim element din ir (acesta poate fi c'iar
elementul din mi*locul irului).
$lasm acest element pe po#iia sa corect n ir adic toate elementele din
st"nga sa vor fi mai mici dec"t ele iar toate elemente din dreapta sa vor fi mai
mari dec"t el.
Relum algoritmul pe subirul din st"nga elementuli fi#at i pe subirul din
dreapta elementului fi#at.
1
Iunc,ia Hsort'), este im+lementare metodei de sortare ra+id% #i se a&l% 0n 3i3lioteca lim3a2ului de +ro.ramare @(
(.
11
#include<iostream.h> ""4UIC5 #)RT
void citi$%();
void a&isa$%();
void 6so$t(int s,int d);
int n,a[20]; ""n$nr. de elemente, a$5ectorul care con,ine #irul
void main()
{citire');
Hsort'0,n$1);
a&isare');
*
void 6so$t(int s,int d) //s-indicele din st4n.a inter5alului, d$indicele din drea+ta inter5alului
{int au,m,i,2; ""au$5aria3il% auiliar% +entru interschim3area elementelor, ind. de mi2loc
i& 's<d) ""dac% mai eist% elemente 0n #ir
{ m=a['s(d)"2]; ""determin%m elementul din mi2locul #irului
i=s; 2=d; ""i$indice, +arcur.e su3#irul st4n. de la st4n.a la drea+ta
do "" 2$indice, +arcur.e su3#irul dre+t de la drea+ta la st4n.a
{7hile ''i<=d) JJ 'a[i]<m)) ""c4t tim+ elementele din st.. sunt 0n ordinea dorit%
i((; "" cre#te i
7hile ''2>=s) JJ 'a[2]>m)) ""c4t tim+ elementele din dr. sunt 0n ordinea dorit%
2$$; "" scade 2
i& 'i<=2) ""dac% mai sunt elemente 0n su3siruri, ele nu sunt 0n orinea dorit%
{au=a[i]; ""le in5ers%m
a[i]=a[2];
a[2]=au;
i((; 2$$; ""cre#te i #i scade 2
*
*
7hile 'i<=2); ""se re+et% al.oritmul c4t tim+ mai sunt elemente 0ntre i #i 2
Hsort's,2); "" se reia al.oritmul +e su3#irul st4n.
Hsort'i,d); "" se reia al.oritmul +e su3#irul dre+t
*
*
12
7.1. Evaluare
3E4356 1
1. Descriei n ce const metoda divide et impera i etapele ei.
4. Dsii erorile n funcia de mai *os.

int aE1@FA
int f(int iint *)
Gint m#HA
if(i>?*)
G#?f(i (iI*)J4)A
H?f((iI*)J4 *)A
return aE(iI*)J4FK#KHAL
else
return @AL
L
7. !e citesc n numere ntregi distincte ntr+un vector a. ! se gseasc dac
e#ist un indice i al vectorului pentru care aEiF?i cu metoda divide et impera.
<. !e citesc n numere naturale. ! se calculeze cu metoda divide et impera
suma elementelor prime.
void citi$%() //ti$% dat%lo$
{int i;
cout<<!n=!; cin>>n;
&or 'i=0;i<n;i(()
{cout<<!a[!<<i<<!]=!;cin>>a[i];*
*
void a&isa$%() //i7a$%a dat%lo$
{int i;
cout<<!sirul ordonat esteC !;
&or'i=0;i<n;i(()
cout<<a[i]<<! !;
cout<<endl;
*
16

3E4356 2
1. 0dentificai ce s+a omis din definiia de mai *os.
Divide et impera este o metoda general de elaborare a algoritmilor. n cadrul
acestei metode distingem trei etape:
Descompunerea problemei ce trebuie rezolvat n dou sau mai multe
subcazuri (subprobleme) mai mici ale aceleiai probleme.
Rezolvarea succesiv a fiecru subcaz.
4. Dsii greala n funcia f de mai *os.
int f(int iint *int #)
G int mA
if(li>ls)
G m?(liIls)J4A
if (#??aEmF)
return 1A
else
if (#>aEmF)
return cauta(lim+1#)A
else
return cauta(mI1ls#)A
L
else
return @A
L
7. !e citesc n numere ntregi. ! se calculeze cu metoda divide et impera
produsul numerelor care au ultima cifr egal cu #. Mnde # este o cifr citit de
la tastatur.
<. ! se determine folosind metoda divide et impera ma#imul elementelor
negative dintr+un ir de n elemente numere ntregi.
3E4356 1
1. !e citete un ir de numere reale din fiierul D(.5.03. ! se ordoneze irul
descresctor aplic"ndu+se metoda de sortare prin interclasare.
2. 6ie un trung'i cu n linii (1>?n>?1@@). $e fiecare linie se gsesc i numere ntregi.
! se determine suma minim fotmat din numere aflate pe un drum ntre
numrul de pe prima linie i un numr de pe ultima linie.
6iecare numr de pe acest drum este situat sub precedentul la st"nga sau
la dreapta acestuia.
Datele se citesc din fiierul D(.5.03 astfel:
+pe prima linie se gsete n numrul de linii
+pe urmtoarele n linii se gsesc elementele triung'iului.
7.7. Pro"leme propuse
1. ! se numere elementele pare ale unui vector cu n numere ntregi folosind
metoda divide et impera.
4. ! se numere elementele prime ale unui vector care conine n numere ntregi
folosind metoda divide et impera.
7. 6ie a un vector ordonat cresctor. ! se determine dac e#ist un element al
vectorului carea are suma cifrelor egal cu 9 folosind metoda divide et impera.
<. !e citete un vector cu n elemente numere reale. ! se calculeze suma
elementelor aflate pe poziii impare.
9. ! se determine simultan minimul i ma#imul unui vector cu n numere ntregi
folosind metoda divide et impera.
=. ! se calculeze:
a
nJ4
Ka
nJ4
pentru n par i nN@
a
n
?G aKa
n+1
pentru n impar i nN@
1 pentru n?@
unde a i n sunt numere ntregi pozitive.
8. D'icii numrul. Realizai un *oc astfel nc"t calculatorul s poat g'ici un numr
cuprins ntre 1 i 1@@@ evident din c"t mai puine ntrebri la care dumneavoastr
s rspundei prin %da& sau %nu&. 0ntrebrile pot fi doar de forma:
- numrul este egal cu O-
- numrul este mai mare dec"t O-
- numrul este mai mic dec"t O-

1<