Pagini recente » Cod sursa (job #3206160) | Cod sursa (job #999825) | Cod sursa (job #512895) | Cod sursa (job #1011390) | Cod sursa (job #708673)
Cod sursa(job #708673)
#include <fstream>
#include <cstdio>
using namespace std;
const int N=305;
const double E=1e-10;
double v[N][N],rez[N];
int n,m;
ifstream in("gauss.in");
inline double abs(double x)
{
return x>0 ? x : -x;
}
inline bool zero(double x)
{
return abs(x)<E;
}
inline void sch(double &a,double &b)
{
double c=a;a=b;b=c;
}
void sch(double a[],double b[])
{
for (int i=1;i<=m+1;i++)
sch(a[i],b[i]);
}
int find(int x,int i)
{
for (;i<=n;i++)
if (!zero(v[i][x]))
return i;
return -1;
}
void reduce(double a[],double b[],double x)
{
for (int i=1;i<=m+1;i++)
a[i]-=x*b[i];
}
bool gauss()
{
int L=1,i,j;
for (i=1;i<=m;i++)
{
j=find(i,L);
if (j==-1)
continue;
if (j!=L)
sch(v[j],v[L]);
double x=v[L][i];
for (j=1;j<=m+1;j++)
v[L][j]/=x;
for (int j=1;j<=n;j++)
if (j!=L)
reduce(v[j],v[L],v[j][i]);
L++;
}
for (i=1;i<=n;i++)
{
for (j=1;j<=m+1 && zero(v[i][j]);j++);
if (j==m+1)
return false;
rez[j]=v[i][m+1];
}
return true;
}
int main()
{
freopen("gauss.out","w",stdout);
in>>n>>m;
for (int i=1;i<=n;i++)
for (int j=1;j<=m+1;j++)
in>>v[i][j];
if (!gauss())
{
printf("Imposibil\n");
return 0;
}
for (int i=1;i<=m;i++)
printf("%.8lf ",rez[i]);
printf("\n");
return 0;
}