Sunteți pe pagina 1din 13

27/02/2024

……………………………………………………………………………………………..

1. Divide et impera
int x[100], n;
int suma(int st, int dr)
{if(st==dr)
return x[st];
else
{int mij, s1,s2;
mij=(st+dr)/2;
s1=suma(st,mij);
s2=suma(mij+1,dr);
return s1+s2;
}

problema 1
—----------------------------------------------------------------------------------------------

Calculati suma elementelor dintr-un sir cu n valori intregi.

#include <iostream>

using namespace std;


int n, x[100];
void citire(int n)
{
if(n>0)
{
citire(n-1);
cin>>x[n];
}
}
int suma_recursiva(int n)
{
if(n==0)
return 0;
else
return suma_recursiva(n-1)+x[n];
}
int suma_divide(int st, int dr)
{
if(st==dr)
return x[st];
else{
int mj;
mj=((st+dr)/2);
return suma_divide(st,mj)+suma_divide(mj+1,dr);
}
}
int main()
{

cin>>n;
citire(n);
cout<<suma_recursiva(n);
cout<<endl;
cout<<suma_divide(1,n);
return 0;
}

problema 2
—----------------------------------------------------------------------------------------------

Determinati elementul maxim dintr-un sir cu n valori naturale.

#include <iostream>

using namespace std;


int n, x[100],maxi;
void citire(int n)
{
if(n>0)
{
citire(n-1);
cin>>x[n];
}
}

///recursiv
int maxim(int n, int i)
{

if(i<=n)
{
if(x[i]>maxi)
maxi=x[i];
return maxim(n,i+1);
}
return maxi;
}

///varianta divide
int maximd(int st, int dr)
{
if(st==dr)
return x[st];
else
{
int m, max1, max2;
m=(st+dr)/2;
max1=maximd(st,m);
max2=maximd(m+1,dr);
if(max1>max2)
return max1;
else
return max2;

}
}

//alta varianta idk


int maxim_recursiv(int n)
{
if(n>0)
{if(x[n]>maxi)
maxi=x[n];
return maxim_recursiv((n-1));
}
return maxi;
}

int main()
{

cin>>n;
citire(n);
cout<<maxim(n,1)<<endl<<maximd(1,n);
return 0;
}

problema 3 ---------------------------------------------------------------------------------------------

Determinati numarul cu suma cifrelor maxima din sir. Daca sunt mai multe cu aceeași
suma returnati-l pe cel mai mic

caz particular

n=5

47 31 351 713 12
11 4 9 11 3

FUNCTII NECESARE
int suma-cif(int a)
void citire(int n)
int divide(int st, int dr)

TEMA 27 februarie
(multumim Irinucaaa)

VARIANTA 50
b)2
VARIANTA 51 NU EXISTA
VARIANTA 52
int f(int n)
{ if (n==0) return 0;
if(n%2==1)return n-f(n-1);
return f(n-1)-n
}
F(4) = 0
F(9)= 9

f(3) -4

3-f(2)

f(1)-2

1-f(0)

0
9-f(8)

f(7)-8

7-f(6)

f(5)-6

5-f(4)
↓ (ca mai sus)
…0
VARIANTA 53
int f(unsigned int n)
{
if (n==0) return 0;
else if(n%2==0)
return n%10+f(n/10);
else return f(n/10);
}
[10,20] … f(n)=0
11 13 15 17 19
VARIANTA 54

void f(int i)
{
if(i<=5) {
cout<<i<<” ” ;
f(i+1);
cout<<i/2<<” ”;
} } (in subiect nu era acolada la void asa ca am presupus ca acolo trebuia sa fie 😞😢)

F(1) = 1 2 3 4 5 2 2 1 1 0

1 f(2) 0

2 f(3) 1

3 f(4) 1

4 f(5) 2

5 f(6) 2
GATAAA!!

EXERCITIUL 3
///Determinati numarul cu suma cifrelor maxima din sir. Daca sunt mai multe cu aceeași suma
returnati-l pe cel mai mic
#include <iostream>

using namespace std;


int n, v[100];
void citire(int n)
{
if(n>0)
{
citire(n-1);
cin>>v[n];
}
}
///suma recursiva
int suma( int n)
{
if (n==0) return 0;
else
return n%10+suma(n/10);
}
///functie de divide
int divide(int st, int dr)
{
if(st==dr)
return v[st];
else
{
int m, max1, max2;
m=(st+dr)/2;
max1=divide(st,m);
max2=divide(m+1,dr);
if(suma(max1)>suma(max2))
return max1;
else
return max2;

}
}

int main()
{
cin>>n;
citire(n);
cout<<divide(1,n);
return 0;

return 0;
}

27/02/2024

problema ---------------------------------------------------------------------------------------------

Se consideră un şir cu n(n<=100) elemente întregi, Determinaţi numărul de apariţii a unei


valori întregi x, citite de la tastatură.

#include <iostream>

using namespace std;


int n, v[100],x;
///citire
void citire(int n)
{
if(n>0)
{
citire(n-1);
cin>>v[n];
}
}

///functie de divide
int div(int st, int dr)
{
if(st==dr)
return v[st];
else
{
}
}
///metoda iterativa
int aparitii()
{
int ap=0;
for(int i=1;i<=n;i++)
if(v[i]==x)
ap++;
return ap;
}

///metoda recursiva
int aparitii_r(int n)
{
if(n==0)
return 0;
if(v[n]==x)
return 1+aparitii_r(n-1);
return aparitii_r(n-1);
}
///divide
int divide(int st, int dr)
{
if(st==dr)
if(v[st]==x)
return 1;
else
return 0;
else
{
int mijl;
mijl=(st+dr)/2;
return divide(st,mijl)+divide(mijl+1,dr);
}
}
int main()
{
cin>>n;
citire(n);
cout<<"Valoarea cautata= ";
cin>>x;
cout<<aparitii();
cout<<endl;
cout<<aparitii_r(n);
cout<<endl;
cout<<divide(1,n);
return 0;
}

29/02/2024

problema ---------------------------------------------------------------------------------------------
Ex7 de la tema prin DIVIDE

int comp(int st, int dr)


{
if(st==dr)
return 0;
else
{ int mij=(dr+st)/2;
int v1,v2;
v1=comp(st,mij);
v2=comp(mij+1,dr);
if(v1==1 || v2==1)
return 1;
for(int i=st;i<=mij;i++)
for(int j=mij+1;j<=dr;j++)
if(v[i]==v[j]
return 1;
return 0;
}
}
12/03/2024

problema ---------------------------------------------------------------------------------------------

5. Verificati daca un sir este ordonat crescator.

Ex. n=5
5 6 9 13 14

#include <iostream>

using namespace std;


void citire (int n,int x[])
{
if (n!=0)
{
citire(n-1,x);
cin>>x[n];
}
}
int divide(int x[],int st, int dr)
{
if (st==dr)
return 1;
else
{
int mij=(st+dr)/2;
int c1,c2;
c1=divide(x,st,mij);
c2=divide(x,mij+1,dr);
if (c1 && c2 && x[mij]<x[mij+1])
return 1;
else
return 0;
}
}
int main()
{
int n,x[50];
cin>>n;
citire (n,x);
cout<<divide(x,1,n);
return 0;
}

Turnurile din Hanoi


--------------------------------------------------------------------------------------

6. Verificati daca un sir este ordonat crescator.

JOC ONLINE

#include <iostream>

using namespace std;


void citire(int n, int x[])
{
if(n!=0)
{
citire(n-1,x);
cin>>x[n];
}
}

void hanoi(int n, char a, char b, char c)


{
if(n==1)
cout<<"( "<<a<<","<<b<<" )"<<endl;
else
{
hanoi(n-1,a,c,b);
cout<<"( "<<a<<","<<b<<" )"<<endl;
hanoi(n-1,c,b,a);
}
}

int main()
{
int n, x[50];
char a,b,c ;

cin>>n;
a='a';
b='b';
c='c';
hanoi(n,a,b,c);
return 0;
}

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