Cod sursa(job #2087575)

Utilizator osiaccrCristian Osiac osiaccr Data 13 decembrie 2017 20:44:26
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include <fstream>
#include <iomanip>
#define EPSILON 0.0000000001
#define DEF 310

using namespace std;

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

int n, m, i, j, k;

double A[DEF][DEF], v[DEF];

int main () {
    fin >> n >> m;
    for (int i = 1; i <= n; ++ i) {
        for (int j = 1; j <= m + 1; ++ j) {
            fin >> A[i][j];
        }
    }

    i = 1; j = 1;
    while (i <= n && j <= m) {
        for (k = i; k <= n; ++ k) /// Caut primul sir nenul
            if (A[k][j])
                break;
        if (k == n + 1) { /// Nu il gasesc, trec mai departe
            ++ j;
            continue;
        }
        if (k != i) { /// L-am gasit, asa ca il mut pe linia i
            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 p = j + 1; p <= m + 1; ++ p) {
                A[l][p] -= A[i][p] * A[l][j];
                /// Fac scaderea cu scopul de a reduce lini i
                /// numai la elem. nule
            }
            A[l][j] = 0;
        }
        ++ i;
        ++ j;
    }

    for (int i = n; i >= 1; -- i) {
        for (j = 1; j <= m + 1; ++ j) {
            if (A[i][j] < -EPSILON || EPSILON < A[i][j])
                /// Echivalent cu A[i][j] == 0
                break;
        }
        if (j == m + 2)
            continue;
        if (j == m + 1) {
            fout << "Imposibil\n";
            return 0;
        }
        v[j] = A[i][m + 1];
        for (int k = j + 1; k <= m; ++ k) {
            v[j] -= v[k] * A[i][k];
        }
    }

    for (int i = 1; i <= m; ++ i)
        fout << setprecision(10) << fixed << v[i] << " ";

    return 0;
}