Cod sursa(job #1759357)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 18 septembrie 2016 21:54:29
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include <bits/stdc++.h>
 
using namespace std;
 
const int MAX_N = 300;
const long double EPS = 1e-10;
 
long double A[MAX_N + 1][MAX_N + 1];
long double ans[MAX_N];
 
int main() {
    ifstream fin("gauss.in");
    ofstream fout("gauss.out");
    fin.tie(0);
    ios_base::sync_with_stdio(false);
 
    int N, M; fin >> N >> M;
    int i, j;
 
    for (i = 0; i < N; ++ i) {
        for (j = 0; j <= M; ++ j) {
            fin >> A[i][j];
        }
    }
 
    for (j = 0; j < M; ++ j) {
        A[N][i] = 1.0;
    }
 
    i = 0; j = 0;
 
    while (i < N && j < M) {
 
        int k = i;
        while (fabs(A[k][j]) <= EPS) {
            ++ k;
        }
 
        if (k != N) {
            swap(A[i], A[k]);
 
            for (k = j + 1; k <= M; ++ k) {
                A[i][k] /= A[i][j];
            }
 
            A[i][j] = 1.0;
 
            for (k = i + 1; k < N; ++ k) {
                const long double coef = A[k][j];
 
                for (int column = j; column <= M; ++ column) {
                    A[k][column] -= coef * A[i][column];
                }
            }
            ++ i;
        }
        ++ j;
    }
 
    for (i = N - 1; i >= 0; -- i) {
        j = 0;
 
        while (j <= M && fabs(A[i][j]) <= EPS) {
            ++ j;
        }
 
        if (j == M) {
            fout << "Imposibil\n";
            fout.close();
            return 0;
        } else if (j < M) {
            ans[j] = A[i][M];
 
            for (int k = j + 1; k < M; ++ k) {
                ans[j] -= ans[k] * A[i][k];
            }
        }
    }
 
    fout.precision(25); fout << fixed;
    for (i = 0; i < M; ++ i) {
        fout << ans[i] << ' ';
    }
    fout << '\n'; fout.close();
 
    return 0;
}