Cod sursa(job #1357725)

Utilizator Eugen01Vasilescu Eugen Eugen01 Data 24 februarie 2015 02:39:45
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 kb
#include<iostream>
#include<fstream>

#define Nmax 305
#define eps 0.0000001

using namespace std;

ifstream in("gauss.in");
ofstream out("gauss.out");

double a[Nmax][Nmax], sol[Nmax], rez[Nmax];

int main()
{
    int n, m;

    in >> n >> m;
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <=m; j++)
            in >> a[i][j];
        in >> sol[i];
    }

    int i = 1;
    int j = 1;

    while (i <= n && j <= m)
    {
        int line;
        double f;

        for (line = j; line <= n; line++)
            if (a[line][j] > eps || a[line][j] < -eps)
                break;

        if (line == n+1)
        {
            j++;
            continue;
        }

        for (int k = j; k <= m; k++)
        {
            double aux = a[i][k];
            a[i][k] = a[line][k];
            a[line][k] = aux;
        }

        double aux = sol[i];
        sol[i] = sol[line];
        sol[line] = aux;

        f = a[i][j];
        for (int k = j; k <= m; k++)
            a[i][k] /= f;
        sol[i] /= f;

        for (int k = i + 1; k <= n; k++)
        {
            f = a[k][j];
            for (int q = j; q <= m; q ++)
                a[k][q] -= (f * a[i][q]);
            sol[k] -= (f * sol[i]);
        }

        i++;
        j++;
    }

    j = m;
    for (int i = n; i >= 1; i--)
    {
        while (a[i][j-1] > eps || a[i][j-1] < -eps)
        {
            rez[0] = 0;
            j--;
        }

        if (a[i][j] < eps && a[i][j] > -eps)
        {
            if (sol[i] < eps && sol[i] > -eps)
                continue;

            out << "Imposibil\n";
            return 0;
        }

        rez[j] = sol[i];

        for (int k = j + 1; k <= m; k++)
            rez[j] -= (rez[k] * a[i][k]);

    }

    out.setf(ios::fixed);
	out.precision(9);

    for (int i = 1; i <= m; i++)
        out << rez[i] << " ";
}