Sunteți pe pagina 1din 3

1.

Folosind metoda divide et impera, scriei un subprogram care s determine dac un tablou cu
elemente ntregi este ordonat cresctor.

#include <iostream>
using namespace std;
int n, i, v[50];

int ordon(int v[], int s, int d)


{
if(s==d) return 1;
else
if(ordon(v,s,(s+d)/2) && ordon(v,(s+d)/2+1,d) && v[(s+d)/2]<=v[(s+d)/2+1]) return 1;
else return 0;
}

int main (){


cout<<"Dati nr. de elemente ale vectorului ";
cin>>n;
for (i=1;i<=n;i++){
cout<<"v["<<i<<"]=";
cin>>v[i];
}
if(ordon(v,1,n)==1) cout<<"Vectorul este ordonat";
else cout<<"Vectorul nu este ordonat";
}

2. Cutare binar (binary search)


Algoritmul de cutare binar este un algoritm de cutare folosit pentru a gsi un element ntr-o
list ordonat (tablou unidimensional/vector).
Algoritmul funcioneaz pe baza tehnicii divide et impera.
Valoarea cutat este comparat cu cea a elementului din mijlocul listei. Dac e egal cu cea a
acelui element, algoritmul se termin. Dac e mai mare dect acea valoare, algoritmul se reia, de
la mijlocul listei pn la sfrit, iar dac e mai mic, algoritmul se reia pentru elementele de la
nceputul listei pn la mijloc.
Obs.:se mai numete cutare logaritmic.
#include<iostream>
using namespace std;
int n,x,v[10],m;
int caut (int s, int d)
{
if(s>d)
return 0;
else
{
m =(s+d)/2;
if (x==v[m])
return m;
if (x<v[m])
return caut(s,m-1);
else
return caut(m+1,d);
}
}
int main()
{
cout<<"Dati n ";
cin>>n;
cout<<"dati "<<n<<" elemente (in ordine crescatoare)"<<endl;
for (int i=1;i<=n;i++)
cin>>v[i];
cout<<"Dati elementul cautat x ";
cin>>x;
cout<<"elementul "<<x<<" a fost gasit pe pozitia: "<<caut (1,n);
}

3. S se determine elementul minim dintr-un vector folosind divide et impera.

#include<iostream>
using namespace std;
int a[100];
int n ;
int min(int s , int d)
{
if ( s == d ) return a[s];
else
{
int m = (s+d)/2;
int m1 = min(s,m);
int m2 = min(m+1,d);
if ( m1 < m2 ) return m1;
else return m2;
}
}

int main()
{
cout<<"n=";
cin>> n;
for (int i=1 ; i<=n ;i++){
cout<<"a["<<i<<"]=";
cin>>a[i];}

cout << min(1,n);

4. Sa se calculeze cmmdc al elementelor unui vector folosind divide et impera.

#include<iostream>

using namespace std;

int cmmdc(int a[100], int s, int d)


{ if(s==d) return a[s];
else
{ int x,y;
x=cmmdc(a,s,(s+d)/2);
y=cmmdc(a,(s+d)/2+1,d);
while(x!=y)
if(x>y) x=x-y;
else y=y-x;
return x;
}
}

int main()
{
int a[100],n,i;
cin>>n;
for(i=1;i<=n;i++) cin>>a[i];
cout<<cmmdc(a,1,n);