Probleme rezolvate
Pentru fiecare dintre problemele de mai jos sunt prezentate 2 modalitati de rezolvare:
- cu functii de tip void
- cu functii (care returneaza o valoare)
Folosind metoda Divide et impera sa se afiseze produsul numerelor de la 1..n. n se citeste de la tastura.
#include<iostream.h>
int a[20],n;
void citire()//datele de intrare
{
cout<<"n=";cin>>n;
}
int produs(int p,int u)/*p-pozitia primului element din sirul de numere p..u, u-pozitia ultimului element din sirul p..u*/
{int m;
if(p==u)return p;//daca avem un singur element
else
{m=(p+u)/2; //impartim sirul p..u in 2 subsiruri
return produs(p,m)*produs(m+1,u); /*inmultim rezultatele celor 2 subsiruri*/
}
}
void main()
{
citire();
cout<<"produs="<<produs(1,n)<<endl;/*sirul intitial este 1..n. prin urmare p o sa fie 1 si u o sa fie n*/
}
A doua metoda
#include<iostream.h>
int a[20],n,pr;
void citire()//citirea datelor de intrare
{
cout<<"n=";cin>>n;
}
void produs(int p,int u,int &pr)/*p-pozitia primului element, u-pozitia ultimului element din sirul de numere p...u. pr-rezultatul problemei adica produsul numerelor dintre p..u*/
{int m,p1,p2;
if(p==u)pr=p;/*daca sirul are un singur element atunci produsul este valoarea acestui numar*/
else
{m=(p+u)/2;
produs(p,m,p1);/*in p1 retinem produsul elementelor p...m*/
produs(m+1,u,p2);/*in p2 retinem produsul elementelor m+1...u*/
pr=p1*p2;/*inmultim cele 2 rezultate pentru a gasi produsul elementelor p...u*/
}
}
void main()
{
citire();
pr=1;/*initializam produsul cu 1*/
produs(1,n,pr);/*primul element care trebuie inmultit este 1, ultimul este n, pozitiile lor in sirul 1...n sunt 1 respectiv n*/
cout<<"produsul="<<pr<<endl;
}
Se citesc de la tastatura n elemente intregi. Folosind metoda Divide et impera gasiti suma numerelor citite.
Prima metoda:
#include<iostream.h>
int a[20],n;
void citire()//citirea datelor de intrare: vectorul cu n elemente si numarul n
{
cout<<"n=";cin>>n;
for(int i=1;i<=n;i++)
{cout<<"a["<<i<<"]=";
cin>>a[i];
}
}
int suma(int p,int u) //functia care calculeaza suma
{int m;
if(u<p)return 0; /*acest if nu e neaparat necesar. Insa daca se ajunge la o astfel de situatie, functia suma va returna valoarea 0.*/
else if(p==u)return a[p]; /*daca avem un singur element in subproblema pe care trebuie sa o rezolvam atunci suma este egala cu acest numar*/
else
{m=(p+u)/2;//gasim pozitia elementului din mijloc
return suma(p,m)+suma(m+1,u);/*impartim problema in doua subprobleme si adunam rezultatele de la fiecare subproblema*/
}
}
void main()
{
citire();
cout<<"suma="<<suma(1,n)<<endl;/*primul element se gaseste pe pozitia 1 si ultimul pe pozitia n*/
}
A doua metoda
#include<iostream.h>
int a[20],n,s;/*datorita faptului ca trebuie aflata o valoare, declaram variabila care retine acea valoare ca variabila globala*/
void citire()
{
cout<<"n=";cin>>n;
for(int i=1;i<=n;i++)
{cout<<"a["<<i<<"]=";
cin>>a[i];
}
}
void suma(int p,int u,int &s) //s retine rezultatul
{int m,s1,s2;
if(u<p)s=0; /*daca se ajunge in situatia ca pozitia primului sa fie mai mare decat pozitia ultimului, adica un caz anormal, suma este 0*/
else if(p==u)s=a[p]; /*daca subsirul (subproblema) are un singur element atunci suma este egala cu valoarea elementului*/
else
{m=(p+u)/2;//gasim pozitia elementului din mijloc
suma(p,m,s1);//s1- suma elementelor din primul subsir
suma(m+1,u,s2);//s2- suma elementelor din cel de-al doilea sir
s=s1+s2;
}
}
void main()
{
citire();
s=0;
suma(1,n,s);/*primul element se gaseste pe pozitia 1 iar ultimul pe pozitia n. Suma se initializeaza cu 0 inainte de a trece la adaugarea elementelor la suma*/
cout<<"suma="<<s<<endl;
}
Folosind metoda Divide et impera sa se gaseasca valoare minima dintr-un sir de n numere intregi.
Prima metoda
#include<iostream.h>
int a[20],n;
void citire()//citim datele de intrare
{
cout<<"n=";cin>>n;
for(int i=1;i<=n;i++)
{cout<<"a["<<i<<"]=";
cin>>a[i];
}
}
int minim(int p,int u)/*functia pentru calcularea minimului; p-pozitia primului element din subsir iar u-pozitia ultimului element din subsir*/
{int m,m1,m2;
if(p==u)return a[p];/*daca avem un singur element in subsir, minimul este egal cu acel element*/
else
{m=(p+u)/2;/*gasim pozitia elementului din mijloc*/
m1=minim(p,m);/*m1- valoare minima din prima parte a subsirului*/
m2=minim(m+1,u);/*m2- valoarea minima din cea de-a doua parte a subsirului*/
if(m1<m2) return m1; /*vedem care dintre cele 2 rezultate este cel mai mic*/
else return m2;
}
}
void main()
{
citire();
cout<<"valoarea minima="<<minim(1,n)<<endl;/*primul elemet din sir se gaseste pe pozitia 1 iar ultimul pe pozitia n*/
}
A doua metoda
#include<iostream.h>
int a[20],n,s,min;
void citire()//citirea datelor de intrare
{
cout<<"n=";cin>>n;
for(int i=1;i<=n;i++)
{cout<<"a["<<i<<"]=";
cin>>a[i];
}
}
void minim(int p,int u,int &min)
{int m,m1,m2;/*primul element din subsir se afla pe pozitia p, ultimul pe pozitia u, iar rezultatul va fi retinut in variabila min*/
if(p==u)min=a[p];/*daca subsirul are un singur element, atunci aceasta este si valoarea minima*/
else
{m=(p+u)/2;/*gasim pozitia elementului din mijloc*/
minim(p,m,m1);/*m1 reprezinta valoarea minima din primul subsir*/
minim(m+1,u,m2);/*m2-valoarea minima din cel de-al doilea subsir*/
if(m1>m2)min=m2; /*valoarea minima este minimul dintre rezultatele subproblemelor*/
else min=m1;
}
}
void main()
{
citire();
min=a[1];/*initializam variabila care retine valoarea minima*/
minim(1,n,min);/*primul element se afla pe pozitia 1, ultimul pe pozitia n, rezultatul se retine in variabila min*/
cout<<"valoarea minima="<<min<<endl;
}