Vous êtes sur la page 1sur 12

QUIK SORT

#include <iostream>
#include <fstream>
using namespace std;
ifstream f("date.in");
int n,a[100];
void citire()
{
f>>n;
for(int i=0;i<n;i++)
f>>a[i];
}
void afisare(int n,int a[])
{
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
}
void quik_sort(int s,int d)
{
int m,i,j,aux;
if(s<=d)
{
m=a[(s+d)/2];
i=s,j=d;
do
{
while(a[i]<m&&i<=d)i++;
while(a[j]>m&&j>=s)j--;
if(i<=j)
{
aux=a[i];
a[i]=a[j];
a[j]=aux;
i++,j--;
}
}while(i<=j);
quik_sort(s,j);
quik_sort(i,d);
}
}
int main()
{
citire();
afisare(n,a);
quik_sort(0,n-1);
afisare(n,a);
return 0;
}
/*Se citeste un vector cu n elemente intregi.Sa se det maximul folosind divide e
t impera*/
#include <iostream>
#include <fstream>
using namespace std;

ifstream f("date.in");
void citire();
void afisare();
int maxim(int li,int ls);
int v[100],n;
int main()
{
citire();
afisare();
cout<<"Elementul maxim e ="<<maxim(0,n-1);
return 0;
}
void citire()
{
f>>n;
for(int i=0;i<n;i++)
f>>v[i];
}
void afisare()
{
for(int i=0;i<n;i++)
cout<<v[i]<<" ";
cout<<endl;
}
int maxim(int li,int ls)
{
int a,b,m;
if(li==ls)
return v[li];
else {
m=(li+ls)/2;
a=maxim(li,m);
b=maxim(m+1,ls);
if(a>b)
return a;
else return b;
}
}

/*Sa se insumeze toate numerele prime dintrun vector*/


#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;
ifstream f("date.in");
int v[100],n;
void citire();
void afisare();
int suma(int li,int ls);
int prim(int a,int d);
int main()
{
citire();
afisare();

cout<<"Suma nr prime din vector e :"<<suma(0,n-1);


return 0;
}
void citire()
{
f>>n;
for(int i=0;i<n;i++)
f>>v[i];
}
void afisare()
{
for(int i=0;i<n;i++)
cout<<v[i]<<" ";
cout<<endl;
}
int suma(int li,int ls)
{
int a,b,m;
if(li<=ls)
{
m=(li+ls)/2;
a=suma(li,m-1);
b=suma(m+1,ls);
if(prim(v[m],2))
return v[m]+a+b;
else return a+b;
}else return 0;
}
int prim(int a,int d)
{
if(a==0||a==1)
return 0;
else{
if(d>sqrt(a))
return 1;
else {if(a%d==0) return 0;
else return prim(a,d+1);
}
}
}

/*Se da o matrice cu n*n elemente ,pe fiecare linie i se afla i elemente intregi
.
Pornind din varf sa se determine suma maxima pana la baza*/
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("date.in");
int a[20][20],n;
void citire();
void afisare();
int suma(int i,int j,int n);
int main()
{
citire();

afisare();
cout<<"Suma maxima="<<suma(1,1,n);
return 0;
}
void afisare()
{
int i,j,p=n-1,k;
for(i=1;i<=n;i++)
{
for(k=1;k<=p;k++)
cout<<" ";
for(j=1;j<=i;j++)
cout<<a[i][j]<<" ";
cout<<endl;p--;
}
}
int suma(int i,int j,int n)
{
int x,y;
if(i<=n)
{
x=suma(i+1,j,n);
y=suma(i+1,j+1,n);
if(x>y)
return x+a[i][j];
else return y+a[i][j];
}else return 0;
}
void citire()
{
f>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
f>>a[i][j];
}

/*Cmmdc*/
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("date.in");
int v[100],n;
void citire();
void afisare();
int euclid(int a,int b);
int cmmdc(int li,int ls);
int main()
{
citire();
afisare();
cout<<"Cmmdc="<<cmmdc(0,n-1);
return 0;
}

void citire()
{
f>>n;
for(int i=0;i<n;i++)
f>>v[i];
}
void afisare()
{
for(int i=0;i<n;i++)
cout<<v[i]<<" ";
cout<<endl;
}
int euclid(int a,int b)
{
if(b)
return euclid (b,a%b);
else return a;
}
int cmmdc(int li,int ls)
{
int a,b,m;
if(ls-li<=1)
return euclid(v[li],v[ls]);
else{
m=(li+ls)/2;
a=cmmdc(li,m);
b=cmmdc(m+1,ls);
return euclid(a,b);
}
}
PROBLEMELE DE PE SITE
/*1. SUMA ELEMENTELOR pare ale unui vector cu n numere ntregi,
folosind metoda divide et impera.*/
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("date.in");
int n,v[100];
void citire()
{
f>>n;
for(int i=0;i<n;i++)
f>>v[i];
}
void afisare()
{
for(int i=0;i<n;i++)
cout<<v[i]<<" ";
cout<<endl;
}
int suma (int li,int ls)
{int s1,s2,m;
if (li==ls)
{if (v[li]%2==0) return v[li];
else
return 0;}

else {m=(li+ls)/2;
s1=suma(li,m);
s2=suma(m+1,ls);
return s1+s2; } }
int main()
{
citire();
afisare();
cout<<suma(0,n-1);
return 0;
}
/*1. 1. S se numere elementele pare ale unui vector cu n numere
ntregi, folosind metoda divide et impera.*/
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("date.in");
int n,v[100],k;
void citire()
{
f>>n;
for(int i=0;i<n;i++)
f>>v[i];
}
void afisare()
{
for(int i=0;i<n;i++)
cout<<v[i]<<" ";
cout<<endl;
}
int suma (int li,int ls)
{int s1,s2,m;
if (li==ls)
{
if (v[li]%2==0){k++;return v[li];}
else
return 0;
}
else {m=(li+ls)/2;
s1=suma(li,m);
s2=suma(m+1,ls);
return s1+s2;
}
}
int main()
{
citire();
afisare();
suma(0,n-1);
cout<<"Sunt "<<k<<" elemente pare";
return 0;
}
/* 2. S se ordoneze cresctor un vector cu n elemente numere reale,
folosind metodele
divide et impera i interclasarea a doi vectori. */
#include <iostream>
using namespace std;

int a[1000],n;
void interclas(int i,int m,int j)
{int b[1000];
int x=i;
int k=1;
int 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);
interclas(i,m,j);}
}
int main()
{
cout<<"n=";cin>>n;
for(int i=1;i<=n;i++)
{cout<<"a["<<i<<"]=";
cin>>a[i];
}
divimp(1,n);
for(int i=1;i<=n;i++)
cout<<a[i]<<' ';
return 0;
}

/* 3. Fie a un vector ordonat cresctor. S se determine


dac exist un element al vectorului carea are suma cifrelor
egal cu 5,
folosind metoda divide et impera.*/
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("date.in");
int n,v[100],sw=0;
void citire()
{
f>>n;

for(int i=0;i<n;i++)
f>>v[i];
}
void afisare()
{
for(int i=0;i<n;i++)
cout<<v[i]<<" ";
cout<<endl;
}
int valid(int x)
{ int suma=0,c;
while(x)
{
c=x%10;
suma=suma+c;
x=x/10;
}
if(suma==5)
return 1;
else return 0;
}
void calcul(int li,int ls)
{
int m;
if(li<ls)
{
m=(li+ls)/2;
if(valid(v[m]))sw=1;
calcul(m+1,n);
}
}
int main()
{
citire();
afisare();
calcul(0,n-1);
if(sw)
cout<<"Da";
else cout<<"Nu";
return 0;
}

/* S se determine simultan minimul i maximul unui vector cu n


numere ntregi, folosind metoda divide et impera.*/
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("date.in");
int n,v[100],minim;
void citire()

{
f>>n;
for(int i=0;i<n;i++)
f>>v[i];
}
void afisare()
{
for(int i=0;i<n;i++)
cout<<v[i]<<" ";
cout<<endl;
}
int maxim(int li,int ls)
{
int a,b,m;
if(li==ls)
return v[li];
else {
m=(li+ls)/2;
a=maxim(li,m);
b=maxim(m+1,ls);
if(a>b)
{
if(b<minim)minim=b;
return a;
}
else {if(a<minim)minim=b;
return b;};
}
}
int main()
{
citire();
afisare();
cout<<"Maxim="<<maxim(0,n-1)<<endl;
cout<<"Minim="<<minim;
return 0;
}

/*
6. S se calculeze:
a la puterea n*/
#include <iostream>
using namespace std;
int calcul(int a,int n)
{
if(n==0)return 1;
if(n%2!=0)return a*calcul(a,n-1);
else return calcul(a,n/2)*calcul(a,n/2);
}
int main()

cout<<calcul(2,5);
return 0;

/*7. Ghicii numrul. Realizai un joc astfel nct calculatorul s poat ghici un numr cu
ntre 1 i 1000 , evident din ct mai puine ntrebri, la care dumneavoastr s rspunde
au nu . Intrebrile pot fi doar de forma:
numrul este egal cu X?
numrul este mai mare dect X?
numrul este mai mic dect X?*/
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("date.in");
int n,x,v[1000];
char r[1];
void citire()
{
n=1000;
for(int i=1;i<=n;i++)
v[i]=i;
}
int ghiceste(int li,int ls)
{
int m;
if(li<=ls)
{
m=(li+ls)/2;
//if(v[m]==x)
cout<<"Numarul e egal cu = "<<v[m]<<endl;
cout<<"Raspuns:";cin>>r;
if(r[0]=='d'&&r[1]=='a')
return 1;
else {
cout<<"Numarul e mai mic ca = "<<v[m]<<endl;
cout<<"Raspuns:";cin>>r;
if(r[0]=='d'&&r[1]=='a')return ghiceste(li,m-1);
else return ghiceste(m+1,ls);
}
}else return 0;
}
int main()
{
citire();
cout<<"Alege un numar de la 1 la 1000"<<endl;
cout<<ghiceste(1,n);
return 0;
}

/* Suma elementelor de pe poziti impare*/

#include <iostream>
#include <fstream>
using namespace std;
ifstream f("date.in");
int n,v[100],k;
void citire()
{
f>>n;
for(int i=0;i<n;i++)
f>>v[i];
}
void afisare()
{
for(int i=0;i<n;i++)
cout<<v[i]<<" ";
cout<<endl;
}
int suma (int li,int ls)
{int s1,s2,m;
m=(li+ls)/2;
if(li<ls)
{
s1=suma(li,m);
s2=suma(m+1,ls);
return s1+s2;
}
else
{if (m%2!=0)
return v[m];
else
return 0;
}
}
int main()
{
citire();
afisare();
cout<<"Suma elementelor de pe poziti impare:"<<suma(0,n-1)<<endl;
return 0;
}

/*TURNURILE DIN HANOI


Se dau 3 tije simbolizate prin a , b , c . Pe tija a se gsesc discuri de diametre
diferite, aezate n ordinea des cresctoare a diametrelor privite de jos n sus. Se ce
re s se mute discurile de pe tija a pe tija b , utiliznd ca tij intermediar tija c ,
respectnd urmtoarele reguli:
- la fiecare pas se mut un singur disc;
- nu este permis s se aeze un disc cu diametrul mai mare peste un disc cu diametru
l mai mic.
a b c a b a b
Exemplul 1 : Pentru n= 1 - avem un disc c b a a b
Exemplul 2 : Pentru n=2
avem do u discuri a b c a c a b c b
Exemplul 3 : a b c Pentru n=3 - avem trei discuri a c b c a b a b c a c b a b

Algoritmul de rezolvare :
Pasul 1: - mutarea a n-1 discuri de pe tija a pe tija c , utiliznd ca tij intermed
iar tija b ;
Pasul 2: - mutarea discului rmas pe tija b ;
Pasul 3: - mutarea a n-1 discuri de pe tija c pe tija b , utiliznd ca tij intermed
iar tija a .
Implementarea algoritmului:
- n
numrul de discuri;
Exemplul : dac se citete pentru n=3 atunci avem 3 discuri.*/
#include <iostream>
using namespace std;
char a,b,c;
int n;
void han (int n, char a, char b, char c)
{
if (n==1) cout<<a<<b<<endl;
else
{
han(n-1,a,c,b);
cout<<a<<b<<endl;
han(n-1,c,b,a);
}
}
int main (void )
{
cout<<"n=";cin>>n;
a='a'; b='b'; c='c';
han(n,a,b,c);
}

Vous aimerez peut-être aussi