Pagini recente » Borderou de evaluare (job #808210) | Borderou de evaluare (job #2015616) | Borderou de evaluare (job #1873190) | Cod sursa (job #2084903) | Cod sursa (job #1965242)
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
#include <cmath>
using namespace std;
const int MaxN=3e2+5;
const double eps=1e-8;
FILE *IN,*OUT;
int N,M;
bool Possible=true;
double Mat[MaxN][MaxN],X[MaxN];
int main()
{
IN=fopen("gauss.in","r");
OUT=fopen("gauss.out","w");
fscanf(IN,"%d%d",&N,&M);
M++;
for(int i=1;i<=N;i++)
for(int j=1;j<=M;j++)
fscanf(IN,"%lf",&Mat[i][j]);
int row=1,col=1;
while(row<=N&&col<M)
{
int one;
for(int i=row;i<=N;i++)
if(abs(Mat[i][col])>eps)
{
one=i;
break;
}
if(one==M)
{
col++;
continue;
}
if(one!=row)
for(int i=1;i<=M;i++)
swap(Mat[one][i],Mat[row][i]);
for(int i=col+1;i<=M;i++)
Mat[row][i]/=Mat[row][col];
Mat[row][col]=1;
for(int i=row+1;i<=N;i++)
{
for(int j=col+1;j<=M;j++)
Mat[i][j]-=Mat[row][j]*Mat[i][col];
Mat[i][col]=0;
}
row++,col++;
}
for(int i=N;i>0&&Possible;i--)
for(int j=1;j<=M;j++)
if(abs(Mat[i][j])>eps)
{
if(j==M)
{
Possible=false;
break;
}
else
{
X[j]=Mat[i][M];
for(int k=j+1;k<M;k++)
X[j]-=X[k]*Mat[i][k];
break;
}
}
if(Possible)
{
for(int i=1;i<M;i++)
fprintf(OUT,"%.8lf ",X[i]);
}
else fprintf(OUT,"Imposibil\n");
return 0;
}