Cod sursa(job #2117140)

Utilizator LucaSeriSeritan Luca LucaSeri Data 28 ianuarie 2018 16:44:54
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <bits/stdc++.h>

using namespace std;

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

const int MAXN = 305;
const double eps = 0.000001;

double mat[MAXN][MAXN];
double sol[MAXN];

int main(){
    int n, m;
    f >> n >> m;

    for(int i = 1; i <= n; ++i)
        for(int j = 1 ; j <= m + 1; ++j)
                f >> mat[i][j];

    int i = 1, j = 1, k;

    while(i <= n && j <= m){
        for(k = i; k <= n; ++k){
            if(mat[k][j] < -eps || mat[k][j] > eps) break;
        }

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

        if(k != i){
            for(int p = 1; p <= m + 1; ++p){
                swap(mat[k][p], mat[i][p]);
            }
        }

        for(int p = m + 1; p >= j; --p) mat[i][p] /= mat[i][j];

        for(int ec = i + 1; ec <= n; ++ec){
            for(int p = m+1; p >= j; --p){
                mat[ec][p] -= mat[ec][j] * mat[i][p];
            }
        }

        ++i, ++j;
    }

    for(int i = n; i; --i){
        for(int j = 1; j <= m+1; ++j){
            if(mat[i][j] < -eps || mat[i][j] > eps){
                if(j == m+1){
                    g << "Imposibil";
                    return 0;
                }

                sol[j] = mat[i][m+1];
                for(int p = j+1; p <= m; ++p){
                    sol[j] -= mat[i][p] * sol[p];
                }

                break;
            }
        }
    }


    for(int i = 1; i <= m; ++i){
        g << setprecision(10) << fixed << sol[i] << ' ';
    }
    return 0;
}