Cod sursa(job #3207149)

Utilizator not_anduAndu Scheusan not_andu Data 25 februarie 2024 13:04:43
Problema Algoritmul lui Gauss Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <bits/stdc++.h>
#pragma GCC optmize ("03")

using namespace std;

#define INFILE "gauss.in"
#define OUTFILE "gauss.out"

const int N_MAX = 3e2 + 5;
const double EPS = 1e-8;

int n, m;
int row[N_MAX];
double v[N_MAX][N_MAX];

bool equalToZero(double number){
    return (-EPS < number && number < EPS);
}

void solve(){

    cin >> n >> m;

    for(int i = 1; i <= n; ++i){
        for(int j = 1; j <= m + 1; ++j){
            cin >> v[i][j];
        }
    }

    int line = 1, column = 1;

    while(line <= n && column <= m){

        if(equalToZero(v[line][column])){
            int ind = line + 1;
            while(ind <= n && equalToZero(v[ind][column])) ++ind;
            if(ind > n){
                ++column;
                continue;
            }
            swap(v[line], v[ind]);
        }

        for(int i = 1; i <= n; ++i){

            if(i == line) continue;

            double aux = v[i][column] / v[line][column];

            for(int j = 1; j <= m + 1; ++j){
                v[i][j] -= aux * v[line][j];
            }

        }

        row[column++] = line++;

    }

    if(column > m){
        for(; line <= n; ++line){
            if(!equalToZero(v[line][m + 1])){
                cout << "Imposibil" << '\n';
                return;
            }
        }
    }

    cout << setprecision(10) << fixed;

    for(int i = 1; i <= m; ++i){
        cout << (row[i] ? (v[row[i]][m + 1] / v[row[i]][i]) : 0.0) << " ";
    }

}

int main(){
    ios_base::sync_with_stdio(false);
    freopen(INFILE, "r", stdin);
    freopen(OUTFILE, "w", stdout);
    cin.tie(0), cout.tie(0);
    solve();
    return 0;
}