Aplicatii


1. Se citeste un numar real x. Sa se calculeze radical de ordinul 3 din x folosind un algoritm de tip Divide et impera.

#include<iostream>
using namespace std;
double r3(double x, double s, double d)
{
       if(d-s<=0.0001) return d;
       else
       { double m=(s+d)/2;
         if(m*m*m<x) return r3(x,m,d);
            else return r3(x,s,m); 
       }
}

int main()
{ double x;
  cin>>x;
  if(x>0) if(x<1) cout<<r3(x,0,1);
          else  cout<<r3(x,0,x);
  else if(x>-1) cout<<r3(x,-1,0);
       else cout<<r3(x,x,0);
  system("pause");
  return 0;
}   
  
2. Se citeste un vector cu n elemente numere naturale. Sa se determine elementul minim din vector folosind Divide et impera.

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

int main()
{
    int a[100];
    int n ;
    cin>> n;
    for (int i = 0 ; i < n ;i++)
        cin>>a[i];
   
    cout << min(a,1,n);
   
    system("pause");
    return 0;
}
  
3. Se citeste un vector cu n elemente numere naturale. Sa se calculeze CMMDC al elementelor vectorului 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);
    system("pause");
    return 0;
}
  
4. Sa se calculeze folosind metoda divide et impera suma elementelor unui vector.

#include<iostream.h>
int v[20],n;
int suma(int li,int ls)
{int m, d1 ,d2;
 if(li!=ls)           
     {m=(li+ls)/2;
      d1=suma(li,m); 
      d2=suma(m+1,ls);
       return d1+d2;
      }
 else 
    return v[li];
}
     
void main() 
{           
 cout<<"n=";
 cin>>n;    
 for(int i=1;i<=n;i++)
   {cout<<"v["<<i<<"]=";
    cin>>v[i];}
cout<<"suma celor "<<n<<" elemente ale vectorului "<<suma(1,n);
}
  
5.Utilizand metoda divide et impera, sa se sorteze prin interclasare un sir

#include<iostream.h>
int a[20],n;   void mergesort(int i,int m,int j){int b[20],x=i,k=1,y=m+1; 
while(x<=m && y<=j)
     if (a[x]<a[y])
           b[k++]=a[x++];
     else
           b[k++]=a[y++];
 while (x<=m)
        b[k++]=a[x++];
 while (y<=j)
        b[k++]=a[y++];
 int t=i;       
 for (k=1;k<=(j-i)+1;k++)
        a[t++]=b[k];     
}                          void divimp(int i,int j)
{if (i<j)
    {int m=(i+j)/2;
     divimp(i,m);  
     divimp(m+1,j);
     mergesort(i,m,j);}
}   void main()
{         
cout<<"n=";
cin>>n;   
for(int i=1;i<=n;i++)
        {cout<<"a["<<i<<"]=";
         cin>>a[i];
        }          
divimp(1,n);
cout<<"vectorul sortat este: "<<endl;
for(i=1;i<=n;i++)
   cout<<a[i]<<' ';
}

6.Cautare binara

Se citeste un vector cu n componente numere intregi, unde nemerele se presupun ordonate crescator si o valoare intreaga (nr). Sa se decida daca nr se gaseste sau nu printre numerele citite, iar in caz afirmativ sa se tipareasca indicele componentei care contine acea valoare .

 O rezolvare in care nr se compara pe rand cu cele n valori, este lipsita de valoare (nu exploateaza faptul ca cele n valori sunt in secventa crescatoare). Algoritmul care va fi propus este mult mai performant si face parte, asa cum am invatat, dintre algoritmii clasici.

 Problema este de a decide daca valoarea cautata se gaseste printre numerele de indice cuprins intre i si j (intial i=1, j=n ). Pentru aceasta vom proceda astfel:daca nr coincide cu vloarea de indice (i+j)/2 ( valoarea de la mijloc ) , se tipaeste indicele si se revine din apel (problema a fost rezolvata).

 Contrar, daca i<j (nu s-a cautat peste tot) problema se descompune astfel:
 daca numaul este mai mic decat valoarea testata (din mijloc), inseamna ca avem sanse sa-l gasim intre componentele cu indicele intre i si (i+j)/2-1 , caz in care reapelam functia cu acesti parametri
 daca numarul este mai mare decat valoarea testata (din mijloc), inseamna ca avem sanse sa-l gasim intre componentele cu indicele intre (i + j)/2+1 si j , caz in care reapelam functia cu acesti parametri.
 Problema nu se descompune in altele care se rezolva, dupa care nu se compara solutia, ci se reduce la o subproblema. In linii mari , acest rationament este de tip Divide et impera.

 #include<iostream.h>
 int v[100],n,nr;
 void caut(int i, int j)
 { if (nr==v[(i+j)/2])
 cout<<"gasit"<<' '<<"indice"<<(i+j)/2;
 else
 if (i<j)
 if (nr<v[(i+j)/2])
 caut (i , (i+j)/2-1;
 else caut ((i+j)/2+1,j);
 };

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

7. Maximul dintr-un vector
 Se citeste un vector cu n componente, numere naturale. Se cere sa se tipareasca valoare maxima.

 Trebuie tiparita valoarea maxima dintre numerele retinute in vector de la i la j(initial i= 1, j=n). Pentru aceasta procedam astfel :daca i=j, valoare maxima va fi v[i] ;
 contrar vom imparti vectorul in doi vectori (primul vector va contine componentele de la i la (i+j) div 2, al doilea va contine componentele de la ((i+j) div 2 +1 la j ) , rezolvam subproblemele (aflam maximul pentru fiecare din ele) iar solutia problemei va fi data de valoarea maxima dintre rezultatele celor doua subprobleme.
 #include<iostream.h>
 int v[10],n;
 int max(int i ,int j)
 { int a,b;
 if (i==j) return v[i] ;
 else
 { a=max(i, (i+j)/2);
 b=max((i+j)/2+1,j);
 if (a>b) return a;
 else return b;
 }
 }
 main( )
 { cout<<"n=";cin>>n;
 for (int i=1;i<=n;i++)
 {cout<<"v["<<i<<"]=";cin>>v[i]; }
 cout<<"max="<<max(1,n);
 }]