Cod sursa(job #1182482)

Utilizator darrenRares Buhai darren Data 6 mai 2014 16:29:31
Problema Algoritmul lui Gauss Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.94 kb
#include <cmath>
#include <fstream>
#include <iomanip>
#include <algorithm>

using namespace std;

const double eps = 1e-4;

int N, M;
double A[302][302], res[302];

int main()
{
    ifstream fin("gauss.in");
    ofstream fout("gauss.out");

    fin >> N >> M;
    for (int i = 1; i <= N; ++i)
        for (int j = 1; j <= M + 1; ++j)
            fin >> A[i][j];

    for (int i = 1, j = 1; i <= N && j <= M; ++i, ++j)
    {
        int w = 0;
        for (int k = i; k <= N; ++k)
            if (fabs(A[k][j]) >= eps)
            {
                w = k;
                break;
            }

        if (w == 0)
        {
            --i;
            continue;
        }

        for (int k = 1; k <= M + 1; ++k)
            swap(A[i][k], A[w][k]);
        for (int k = M + 1; k >= j; --k)
            A[i][k] /= A[i][j];

        for (int l = i + 1; l <= N; ++l)
            if (fabs(A[l][j]) >= eps)
            {
                for (int k = M + 1; k >= j; --k)
                    A[l][k] /= A[l][j];
                for (int k = M + 1; k >= j; --k)
                    A[l][k] -= A[i][k];
            }
    }

    bool imp = false;
    for (int i = N; i >= 1 && !imp; --i)
        for (int j = 1; j <= M + 1 && !imp; ++j)
            if (fabs(A[i][j]) >= eps)
            {
                if (j == M + 1)
                {
                    imp = true;
                    continue;
                }

                res[j] = A[i][M + 1] / A[i][j];
                for (int l = i - 1; l >= 1; --l)
                {
                    A[l][M + 1] -= res[j] * A[l][j];
                    A[l][j] = 0;
                }

                break;
            }

    if (imp)
        fout << "Imposibil" << '\n';
    else
    {
        for (int i = 1; i <= M; ++i)
            fout << fixed << setprecision(9) << res[i] << ' ';
        fout << '\n';
    }

    fin.close();
    fout.close();
}