Pagini recente » Borderou de evaluare (job #3123485) | Borderou de evaluare (job #2214894) | Cod sursa (job #800989) | Cod sursa (job #2463137) | Cod sursa (job #3238862)
#include <fstream>
#include <cmath>
#include <iomanip>
#define Eps 0.0000000001
using namespace std;
ifstream cin("gauss.in");
ofstream cout("gauss.out");
int n,m;
double a[305][305],x[305];
int main()
{
cin>>n>>m;
for(int i=1; i<=n; i++)
for(int j=1; j<=m+1; j++)
cin>>a[i][j];
int i=1,j=1;///i=ecuatie ,j=necunoscuta
while(i<=n &&j<=m)
{
int t=i;///cautam pe coloana j linia x(i<=x) astfel incat a[x][j]!=0
for(t=i; t<=n; t++)
if(a[t][j]!=0)
break;
if(t==n+1)///nu exista acea linie si inseamna ca e variabila libera=> poate fi orice valoare ,iar noi ii dam valoarea 0
{
j++;
continue;
}
if(t!=i)///daca am gasit acea linie o interschimbam cu linia curenta
{
for(int k=1; k<=m+1; k++)
swap(a[i][k],a[t][k]);
}
///eliminam acea necunoscuta din celelalte ecuatii
///prima oara impartim toata linia i cu a[i][j] pentru a-l face pe a[i][j] =1
for(int k=j+1; k<=m+1; k++)
a[i][k]/=a[i][j];
a[i][j]=1;
///pentru a elimina aceasta necunoscuta de pe linia x trebuie sa inmultim linia i cu -a[x][j] si sa o adunam la linia x
for (int k=i+1; k<=n; k++)
{
for(int s=j+1; s<=m+1; s++)
a[k][s]=a[k][s]-a[i][s]*a[k][j];
a[k][j]=0;
}
i++;
j++;
}
///luam in ordine inversa ecuatiile(de la 1 la n)
for(int i=n; i>=1; i--)
{
///aflam prima pozitie nenula
int j=1;
for(j=1; j<=m+1; j++)
if(a[i][j]>Eps ||a[i][j]<-Eps)
{
if(j==m+1)///toate necunoscutele sunt 0 ,doar termenul liber e nenul =>nu avem solutie
{
cout<<"Imposibil";
return 0;
}
x[j]=a[i][m+1];
for(int k=j+1;k<=m;k++)
x[j]=x[j]-x[k]*a[i][k];///scadem din termenul liber necunoscutele pe care le-am aflat anterior inmultite cu coeficientii lor si asa aflam solutia
break;
}
if(j==m+2)///toate necunoscutele sunt 0,iar termenul liber e si el 0(e o combinatie liniara a celorlalte ecuatii)
continue;
}
for(int i=1; i<=m; i++)
cout<<fixed<<setprecision(10)<<x[i]<<" ";
return 0;
}