Pagini recente » Cod sursa (job #3283872) | Cod sursa (job #2670775) | Cod sursa (job #1867105) | Cod sursa (job #2227933) | Cod sursa (job #608633)
Cod sursa(job #608633)
#include <stdio.h>
#include <algorithm>
#define NMax 310
using namespace std;
const char IN[]="gauss.in",OUT[]="gauss.out";
const double epsilon = 0.0001;
int N,M;
int P[NMax];
double Mat[NMax][NMax] , A[NMax][NMax] , R[NMax];
inline double abs(double x){
return x<0 ? -x : x;
}
inline void swaprow(int x,int y){
int i;
for (i=0;i<=M;++i) swap(A[x][i],A[y][i]);
}
void solve()
{
int i,j,k,l;
double p;
for (i=0;i<N;++i) P[i]=-1;
for (i=j=0;i<N && j<M;++j)
{
int maxi=i;
for (k=i+1;k<N;++k)
maxi= abs(A[k][j])>abs(A[maxi][j]) ? k : maxi;
if (A[maxi][j])
{
swaprow(maxi,i);
p=A[i][j];
for (k=0;k<=M;++k) A[i][k]/=p;
for (k=i+1;k<N;++k)
{
p=A[k][j];
for (l=j;l<=M;++l)
A[k][l]= A[k][l]/p - A[i][l];
}
P[i]=j;
++i;
}
}
}
inline bool equal(double a,double b){
return abs(a-b)<epsilon;
}
int main()
{
int i,j,k,x;
double r;
freopen(IN,"r",stdin);
scanf("%d%d",&N,&M);
for (i=0;i<N;++i)
for (j=0;j<=M;++j) scanf("%d",&x),Mat[i][j]=A[i][j]=x;
fclose(stdin);
solve();
for (i=N-1,j=M-1;i>=0;--i)
{
if (P[i]==-1) continue;
//while (!A[i][j]) --j;
while (j>P[i]) --j;
R[j]=A[i][M];
for (k=M-1;k>P[i];--k)
R[j]-=A[i][k]*R[k];
--j;
}
for (i=0;i<N;++i)
{
r=0;
for (j=0;j<M;++j)
r+=R[j]*Mat[i][j];
if (!equal(r,Mat[i][M])) break;
}
freopen(OUT,"w",stdout);
if (i<N) printf("Imposibil"); else
for (i=0;i<M;++i) printf("%.8lf ",R[i]);
printf("\n");
fclose(stdout);
return 0;
}