Pagini recente » Cod sursa (job #251698) | Cod sursa (job #1137482) | Cod sursa (job #1015076) | Cod sursa (job #1389157) | Cod sursa (job #1247774)
#include<stdio.h>
#define NMAX 302
#define EPS 0.0000001
int n, m;
double a[NMAX][NMAX], v[NMAX][NMAX], sol[NMAX];
bool inline egal(double a, double b)
{
if(a-EPS<b && a+EPS>b)
return true;
return false;
}
inline void imp(int lin, double val)
{
for(int j=1; j<=m; ++j)
v[lin][j]/=val;
v[lin][m+1]/=val;
}
inline void schimba(int a, int b)
{
if(a==b)return;
int aux;
for(int j=1; j<=m; ++j)
{
aux=v[a][j];
v[a][j]=v[b][j];
v[b][j]=aux;
}
aux=v[a][m+1];
v[a][m+1]=v[b][m+1];
v[b][m+1]=aux;
}
void inline elim(int a, int b, int x)
{
for(int j=1; j<=m; ++j)
v[a][j]-=v[b][j]*x;
v[a][m+1]-=v[b][m+1]*x;
}
void Gauss()
{
int x=1, y=1, lin;
while(x<=n && y<=m)
{
for(lin=x; lin<=n; ++lin)
if(!egal(v[lin][y], 0))
break;
if(lin<=n)
{
schimba(lin, x);
imp(x, v[x][y]);
for(int i=x+1; i<=n; ++i)
elim(i, x, v[i][y]);
++x;
}
++y;
}
}
void Fin()
{
for(int i=n; i; --i)
for(int j=1; j<=m+1; ++j)
if(v[i][j]>EPS || v[i][j]<-EPS)
{
if(j==m+1)
{
printf("Imposibil\n");
return;
}
sol[j]=v[i][m+1];
for(int k=j+1; k<=m; ++k)
sol[j]-=sol[k]*v[i][k];
break;
}
for(int i=1; i<=m; ++i)
{
if(egal(sol[i], 0))
sol[i]=0;
printf("%.8lf ", sol[i]);
}
}
int main()
{
freopen("gauss.in", "r", stdin);
freopen("gauss.out", "w", stdout);
scanf("%d%d", &n, &m);
for(int i=1; i<=n; ++i)
{
for(int j=1; j<=m; ++j)
scanf("%lf", &a[i][j]);
scanf("%lf", &a[i][m+1]);
for(int j=1; j<=m; ++j)
v[i][j]=a[i][j];
v[i][m+1]=a[i][m+1];
}
Gauss();
Fin();
return 0;
}