Cod sursa(job #1847208)

Utilizator Theodor1000Cristea Theodor Stefan Theodor1000 Data 14 ianuarie 2017 13:26:28
Problema Algoritmul lui Gauss Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#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] >= eps || v[i][m + 1] - rez[m] >= eps) && 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;
}