Cod sursa(job #1232890)

Utilizator mihaimusatMihai Musat mihaimusat Data 24 septembrie 2014 10:10:47
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include <fstream>
#include <algorithm>
#include <iomanip>

using namespace std;

const double eps = 0.00001;

int N, M;
double A[302][302], X[302];
bool impossible;

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];

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

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

        for (int l = i + 1; l <= N; ++l)
        {
            for (int m = j + 1; m <= M + 1; ++m)
                A[l][m] -= A[i][m] * A[l][j];
            A[l][j] = 0;
        }
    }

    for (int i = N; i >= 1; --i)
        for (int j = 1; j <= M + 1; ++j)
            if (A[i][j] < -eps || A[i][j] > eps)
            {
                if (j == M + 1)
                {
                    impossible = true;
                    break;
                }

                X[j] = A[i][M + 1];
                for (int k = i - 1; k >= 1; --k)
                {
                     A[k][M + 1] -= X[j] * A[k][j];
                     A[k][j] = 0;
                 }
                 break;
            }

    if (impossible)
        fout << "Imposibil";
    else
        for (int i = 1; i <= M; ++i)
            fout << fixed << setprecision(8) << X[i] << ' ';
    fout << '\n';

return 0;
}