Sunteți pe pagina 1din 23

Algoritmi numerici

Problema 1
Realizati un algoritm care citeste valoarea lui x, calculeaza si afiseaza valoarea functiei f, definita prin :

() {





Rezolvare:
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
float x,f;
cout<<"x=";cin>>x;
if(x<0)
f=4*pow(x,3)+5*x*x-2*x+1;
if(x==0)
f=100;
if(x>0)
f=2*x*x+8*x-1;
cout<<"f="<<f;
return 0;
}



Date intrare/iesire:


Problema 2
Se citesc n numere. Sa se afiseze suma numerelor citite.







Rezolvare

#include<iostream>
using namespace std;

int main()
{int n,i;
double R,s,p;
s=0;
p=1;
cout<<"n=";cin>>n;
for(i=1;i<=n;i++)
{
s=s+2*i;
p=p*(2*i-1);
R=s/p;
}
cout<<R<<endl;

}
Date intrare/iesire


Problema 3
Elaborati un algoritm care sa rezolve urmatoare ecuatie utilizand metoda tangentei:


Rezolvare

#include <iostream>
#include <cmath>

using namespace std;

double f(double x)
{
return(2*pow(x,3)+4*pow(x,2)+5*x+2);
}
int main()
{
double a, b, eps, x, xp;
int i=0;
cout << "Introduceti capetele intervalului:" << endl;
cout << "a=";
cin >> a;
cout << "b=";
cin >> b;
cout << "Introduceti precizia dorita (epsilon):";
cin >> eps;
x=a;
do
{
xp=x;
x=a-f(a)/(f(b)-f(a))*(b-a);
if(f(a)*f(x)<0)
{
b=x;
}
else
{
a=x;
}
i++;
}
while(abs(x-xp)>=eps);
cout << "Solutia aproximativa a ecuatiei este:" << x <<endl;
cout << "S-a ajuns la aceasta solutie dupa " << i << " iteratii.";
return 0;
}
Date intrare/iesire:



Sortari
Problema 1

Realizati un program care sa sorteze un sir prin metoda sortarii prin numarare.
Rezolvare
#include<stdio.h>
using namespace std;
int main()
{ int n,a[20],b[20],c[20]={0},i,j;

do{
printf("n=");
scanf("%d",&n);

} while((n<1)||(n>20));


for(i=0;i<n;i++)
{ printf("a[%d]=",i);
scanf("%d",&a[i]);
}
printf("vectorul sortat:\n ");
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(a[i]>a[j])
c[i]++;
else c[j]++;
for(i=0;i<n;i++)
b[c[i]]=a[i];
for(i=0;i<n;i++)

printf("%d ",b[i]);

}
Date intrare/iesire




Problema 2
Realizati un program care sa sorteze un sir prin metoda sortarii prin inserare.
Rezolvare
#include<stdio.h>
using namespace std;
int main()
{ int a,n,v[20],i,j;

do{
printf("n=");
scanf("%d",&n);

} while((n<1)||(n>20));

for(i=1;i<=n;i++)
{ printf("v[%d]=",i);
scanf("%d",&v[i]);
}
printf("vectorul sortat:\n ");
for(i=2;i<=n;i++)
{a=v[i];
j=i-1;
while((j>=1)&&(v[j]>a))
{ v[j+1]=v[j];
j--;
}
v[j+1]=a;
}
for(i=1;i<=n;i++)
printf("%d ",v[i]);

}
Date intrare/iesire


Problema 3
Realizati un program care sa sorteze un sir prin metoda sortarii prin selectie
#include<stdio.h>
using namespace std;

int main()
{ int n, a[20],aux,k,min,i,j;
printf("n=");
scanf("%d",&n);
for(i=1;i<=n;i++)
{printf("v[%d]=",i);
scanf("%d",&a[i]);
}
printf("vectorul sortat: \n");
for(i=1;i<=n;i++)
{
min=a[i];
k=i;
for(j=i+1;j<=n;j++)
if(a[j]<min)
{ min=a[j];
k=j;
}
aux=a[k];
a[k]=a[i];
a[i]=aux;
}
for(i=1;i<=n;i++)
printf("%d ",a[i]);

}
Date intrare/iesire


Metoda Greedy
Problema 1
Problema incarcarii optime a unui camion
# include <iostream>

using namespace std;

int w[10],p[10],p_no[10],n,m;
float pwr[10];

template <class T>
void schimba(T *a,int i,int j)
{
T temp;
temp=a[j];
a[j]=a[i];
a[i]=temp;
return;
}

void linie()
{
cout<<"\n";
for(int i=0;i<80;i++)
cout<<"=";
cout<<"\n";
}

void afisare()
{
linie();
cout<<"\n\t\tProblema incarcarii optime a unui camion\n";
linie();
cout<<"\nNumarul de produse: "<<n<<"\nCapacitatea camionului: "<<m<<"\n";
linie();
cout<<"\nNr.\t\tMasa\t\tProfit\t\tProfit per unitate de masa\n";
linie();
for(int i=0;i<n;i++)
cout<<p_no[i]<<"\t\t"<<w[i]<<"\t\t"<<p[i]<<"\t\t"<<pwr[i]<<"\n";
linie();
}

void incarcare()
{
int u,i;
u=m;
float x[10];
for(i=0;i<n;i++)
x[i]=0;
for(i=0;i<n;i++)
{
if(w[i]>u)
break;
else
{
x[i]=1;
u=u-w[i];
}
}
if(i<=n)
x[i]=(float)u/w[i];
for(i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
if(p_no[i]>p_no[j])
{
schimba(p_no,i,j);
schimba(x,i,j);
schimba(p,i,j);
}
}
}
float opt_solution=0;
cout<<"\nOrdinea in care se incarca si cantitatea din fiecare produs incarcat este:\n\n";
for(i=0;i<n;i++)
cout<<p_no[i]<<" ";
cout<<"\t\t";
for(i=0;i<n;i++)
{
cout<<x[i]<<" ";
opt_solution=opt_solution+(p[i]*x[i]);
}
cout<<"\n\nProfitul obtinut este: "<<opt_solution;
}

int main()
{
int i;
cout<<"\nIntroduceti capacitatea camionului: ";
cin>>m;
cout<<"\nIntroduceti numarul de produse disponibile pentru transport: ";
cin>>n;
cout<<"\nIntroduceti caracteristicile celor "<<n<<" produse\n\n";
for(i=0;i<n;i++)
{
p_no[i]=i+1;
cout<<"\nProdusul nr. "<<i+1<<"\n\nMasa: ";
cin>>w[i];
cout<<"\nProfit: ";
cin>>p[i];
pwr[i]=(float)p[i]/w[i];
}
afisare();
for(i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
if(pwr[i]<pwr[j])
{
schimba(p_no,i,j);
schimba(w,i,j);
schimba(p,i,j);
schimba(pwr,i,j);
}
}
}
incarcare();
return 0;


Date intrare/iesire



Problema 2
Intr-o sala de spectacol trebuie planificate n spectacole intr-o zi. Pentru fiecare spectacol se cunosc
ora de inceput si ora de terminare (numere intregi).
Sa se planifice un numar maxim de spectacole astfel inct sa nu fie doua spectacole care sa se
suprapuna.
#include<fstream>
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");

struct spectacol
{
int s,d;
};

void citire(int &n, spectacol a[])
{
fin>>n;
for(int i=1;i<=n;i++)
fin>>a[i].s>>a[i].d;
}

void ordonare(int n, spectacol a[])
{
int i,j;
spectacol aux;
for(i=1;i<n;i++)
for(j=i+1;j<=n;j++)
if(a[i].d>a[j].d)
{
aux=a[i]; a[i]=a[j]; a[j]=aux;
}
}

void afisare(int n, spectacol a[])
{
for(int i=1;i<=n;i++)
fout<<a[i].s<<","<<a[i].d<<" ";
}

void greedy(int n, spectacol a[])
{
spectacol s[100];
int i,k;
k=1;
s[1]=a[1];
for(i=2;i<=n;i++)
if(s[k].d<a[i].s) s[++k]=a[i];
afisare(k,s);
}

int main()
{
int n;
spectacol a[100];
citire(n,a);
ordonare(n,a);
greedy(n,a);
fin.close();
fout.close();
}
Date.in :
7
2 4
8 11
5 6
5 8
3 7
7 8
9 12
Date.out:
2,4 5,6 7,8 9,12

Divite et impera
Problema 1
Sa se calculeze cmmdc pentru n numere utilizand metoda divide et impera.
#include<iostream>
using namespace std;

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

int a[20],n,i;
cout<<"n=";cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
cout<<"cmmdc este: "<<cmmdc(a,1,n);
}

Date intrare/iesire


Problema 2
#include<iostream>
using namespace std;

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];
}

int 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);
}
Date intrare/iesire

Metoda Backtracking
Problema 1
Sa se aranjeze in toate modurile n pisici si m caini astfel incat nicio pisica sa nu fie asezata intre 2
caini
Rezolvare
#include<iostream>
#include<windows.h>

using namespace std;

int x[100],pus[100],n,m,nr=0;

void Write()
{ for(int i=1;i<=n+m;i++) if(x[i]==1) cout<<"P ";
else cout<<"C ";
cout<<endl;
nr++;
}

int cond(int k)
{
int c=0,p=0,i;
for(i=1;i<=k;i++)
if(x[i]==0) c++;
else p++;
if(p>n || c>m) return 0;
if(k>=3) if(x[k-2]==0 && x[k-1]==1 && x[k]==0) return 0;
return 1;
}

void Sub(int k)
{ for(int i=1;i>=0;i--)
{
x[k]=i;
if(cond(k))
if(k==n+m) Write();
else Sub(k+1);
}
}
int main()
{ cout<<"n=";cin>>n;
cout<<"m=";cin>>m;
Sub(1);
cout<<nr;
system("pause");
return 0;
}


Date intrare/iesire


Problema 2
Se citeste un numar natural n si apoi n culori distincte date ca siruri de caractere. Afisati toate
steagurile care se pot forma cu cate 3 culori diferite.
Rezolvare
#include<iostream>
#include<windows.h>

using namespace std;

int x[100],pus[100],n,nr=0;
char s[30][20];

void Write()
{ for(int i=1;i<=3;i++) cout<<s[x[i]]<<" ";
cout<<endl;
nr++;
}
void Aranj(int k)
{ for(int i=1;i<=n;i++)
if(!pus[i])
{ x[k]=i;
pus[i]=1;
if(k==3) Write();
else Aranj(k+1);
pus[i]=0;
}
}

int main()
{ cout<<"n=";cin>>n;
for(int i=1;i<=n;i++) cin>>s[i];
Aranj(1);
cout<<nr;
system("pause");
return 0;
}
Date intrare/iesire

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