Pagini recente » Cod sursa (job #694524) | Cod sursa (job #1278252) | Cod sursa (job #172473) | Istoria paginii runda/omg_comeback/clasament | Cod sursa (job #1369667)
#include <fstream>
#include <iomanip>
#include <cstdio>
using namespace std;
#define MAXIM 310
#define EPS 0.0000001
ifstream cin("gauss.in");
int n,m,k,i,j,i2,j2;
double mat[MAXIM][MAXIM],x[MAXIM],aux;
/*
void scrie()
{
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m+1; j++)
cout<<mat[i][j]<<" ";
cout<<"\n";
}
cout<<"\n\n";
}
*/
int main()
{
cin>>n>>m;
for(i=1; i<=n; i++)
for(j=1; j<=m+1; j++)
cin>>mat[i][j];
i=1; j=1;
while(i<=n && j<=m)
{
//1 : caut linie pe coloana curenta unde mat[k][j] != 0
for(k=i; k<=n; k++)
if(mat[k][j]>-EPS || mat[k][j]<EPS)
break;
//2 : daca nu gasesc linia
if(k>n)
{
j++;
continue;
}
//3 : swap-ul intre mat[k][j2] si mat[i][j2] in incercarea de a face 0 sub diagonala principala
if(k!=i)
for(j2=1; j2<=m+1; j2++)
swap(mat[k][j2],mat[i][j2]);
//4 : impart mat[i][1,2...m+1] la mat[i][j]
for(j2=j+1; j2<=m+1; j2++)
mat[i][j2]/=mat[i][j];
mat[i][j]=1;
//5 : pt ecuatiile i+1,i+2..n formez 0 pe coloana j
for(i2=i+1; i2<=n; i2++)
{
for(j2=j+1; j2<=m+1; j2++)
mat[i2][j2]-= mat[i2][j] * mat[i][j2];
mat[i2][j]=0;
}
i++; j++;
}
freopen("gauss.out","w",stdout);
for(int i = n; i>0; i--)
for(int j = 1; j <= m+1; j++)
if(mat[i][j]>EPS || mat[i][j]<-EPS)
{
if(j == m+1)
{
printf("Imposibil\n");
return 0;
}
x[j] = mat[i][m+1];
for(int k = j+1; k <= m; ++k)
x[j] -= x[k] * mat[i][k];
break;
}
for(int i = 1; i <= m; i++)
printf("%.8lf ", x[i]);
}