Cod sursa(job #1970168)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 18 aprilie 2017 23:12:03
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <bits/stdc++.h>
using namespace std;

constexpr int maxn = 310;
constexpr double eps = 1e-9;

bool is_zero(const double d){
    return -eps <= d && d <= eps; }

int vars = 0, eqs = 0;
double buf[maxn][maxn] = {}, rez[maxn] = {};

bool do_gauss(){
    for(int eq = 0, var = 0; eq < eqs && var < vars; ){
        int eq_switch = eq;
        while(eq_switch < eqs && is_zero(buf[eq_switch][var])) ++eq_switch;
        if(eq_switch == eqs){
            ++var;
            continue; }
        if(eq_switch != eq) swap_ranges(buf[eq], buf[eq] + vars+1, buf[eq_switch]);
        for(int eq_ = eq+1; eq_ < eqs; ++eq_){
            const double mult = buf[eq_][var] / buf[eq][var];
            for(int var_ = var; var_ <= vars; ++var_)
                buf[eq_][var_] -= mult * buf[eq][var_]; }
        ++var, ++eq; }
    for(int eq = 0; eq < eqs; ++eq)
        if(all_of(buf[eq], buf[eq]+vars, &is_zero) && !is_zero(buf[eq][vars])) return false;
    for(int eq = eqs-1; eq >= 0; --eq){
        int var = 0;
        while(var < vars && is_zero(buf[eq][var])) ++var;
        if(var == vars) continue;

        rez[var] = buf[eq][vars];
        for(int var_ = var+1; var_ < vars; ++var_)
            rez[var] -= buf[eq][var_] * rez[var_];
        rez[var] /= buf[eq][var]; }
    return true; }

int main(){
    ifstream f("gauss.in");
    ofstream g("gauss.out");
    f >> eqs >> vars;
    for(int eq = 0; eq < eqs; ++eq)
        for(int var = 0; var <= vars; ++var)
            f >> buf[eq][var]; 
    if(!do_gauss()) g << "Imposibil" << endl;
    else for(int var = 0; var < vars; ++var) g << fixed << setprecision(10) << rez[var] << ' ';
    return 0; }