Pagini recente » Cod sursa (job #1759215) | Cod sursa (job #566471) | Cod sursa (job #1807483) | Cod sursa (job #1369407) | Cod sursa (job #1847082)
#include <cstdio>
#include <algorithm>
#define eps 1e-8
using namespace std;
double v[310][310], rez[310];
int main ()
{
freopen ("gauss.in", "r", stdin);
freopen ("gauss.out", "w", stdout);
int n, m;
scanf ("%d %d", &n, &m);
if (n < m)
{
printf ("Imposibil\n");
return 0;
}
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m + 1; ++j)
scanf ("%lf", &v[i][j]);
for (int j = 1; j < m; ++j)
{
bool OK = false;
for (int i = j; i <= n && !OK; ++i)
if (!(v[i][j] > -eps && v[i][j] < eps)) swap (v[j], v[i]), OK = true;
if (!OK)
{
printf ("Imposibil\n");
return 0;
}
double x = v[j][j];
for (int h = j; h <= m + 1; ++h)
v[j][h] /= x;
for (int i = j + 1; i <= n; ++i)
{
x = v[i][j];
for (int h = j; h <= m + 1; ++h)
v[i][h] -= v[j][h] * x;
}
}
rez[m] = 2000000000000.0;
for (int i = m; i <= n; ++i)
{
if (v[i][m] == 0)
{
printf ("Imposibil\n");
return 0;
}
v[i][m + 1] /= v[i][m];
v[i][m] = 1;
if (rez[m] != v[i][m + 1] && rez[m] != 2000000000000.0)
{
printf ("Imposibil\n");
return 0;
}
rez[m] = v[i][m + 1];
}
for (int i = m - 1; i; --i)
{
double sol = 0.0;
for (int j = i + 1; j <= m; ++j)
sol += v[i][j] * rez[j];
rez[i] = v[i][m + 1] - sol;
}
for (int i = 1; i <= m; ++i)
printf ("%.12f ", rez[i]);
printf ("\n");
return 0;
}