Cod sursa(job #1919331)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 9 martie 2017 18:53:17
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <bits/stdc++.h>
using namespace std;

constexpr int maxn = 310;
constexpr bool is_zero(const double x){
    return x > -1e-9 && x < 1e-9; }

double mat[maxn][maxn] = {}, rez[maxn] = {};

void do_gauss(){
    for(int ec = 0, var = 0; ec < maxn && var < maxn; ){
        if(is_zero(mat[ec][var])){
            int ec_ = ec;
            while(ec_ < maxn && is_zero(mat[ec_][var])) ++ec_;
            if(ec_ == maxn){
                ++var;
                continue; }
            for(int i = 0; i < maxn; ++i) swap(mat[ec][i], mat[ec_][i]); }
        for(int ec_ = ec+1; ec_ < maxn; ++ec_){
            const double mult = mat[ec_][var] / mat[ec][var];
            for(int var_ = var; var_ < maxn; ++var_){
                mat[ec_][var_] -= mult * mat[ec][var_]; } }
        ++ec, ++var; } }

int main(){
    ifstream f("gauss.in");
    ofstream g("gauss.out");
    int n, m;
    f >> n >> m;
    for(int i = 0; i < n; ++i){
        for(int j = 0; j < m; ++j) f >> mat[i][j];
        f >> mat[i][maxn-1]; }
    do_gauss();
    for(int ec = maxn-1; ec >= 0; --ec){
        int var = 0;
        while(var < maxn-1 && is_zero(mat[ec][var])) ++var;
        if(var == maxn-1){
            if(!is_zero(mat[ec][maxn-1])){
                g << "Imposibil" << endl;
                return 0; }
            else continue; }
        rez[var] = mat[ec][maxn-1];
        for(int var_ = maxn-2; var_ > var; --var_){
            rez[var] -= mat[ec][var_] * rez[var_]; }
        rez[var] /= mat[ec][var]; }
    for(int i = 0; i < m; ++i) g << fixed << setprecision(10) << rez[i] << ' ';
    return 0; }