Cod sursa(job #2629538)

Utilizator nicolaefilatNicolae Filat nicolaefilat Data 21 iunie 2020 14:19:02
Problema Algoritmul lui Gauss Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.08 kb
#include <iostream>
#include <fstream>
#include <iomanip>
#include <cmath>

const int MAXN = 300 + 1;
const long double PRECIZIE = 1e-12;

using namespace std;

typedef long double ld;

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

int n,m;
ld v[MAXN + 1][MAXN + 1];
ld ans[MAXN];
bool viz[MAXN];

void afis(){
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= m + 1; j++)
            cout<<setprecision(7)<<fixed<<v[i][j]<<" ";
        cout<<endl;
    }
    cout<<endl;
}

int main()
{
    in>>n>>m;
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m + 1; j++)
            in>>v[i][j];
    int inceput = 1;
    for(int j = 1; j <= m - 1; j++){
        for(int i = inceput + 1; i <= n; i++){
            ld x1 = v[inceput][j];
            ld x2 = v[i][j];
            ld inmulteste = -x1/x2;
            //cout<<"linia "<<i<<" "<<inmulteste<<endl;
            for(int k = 1; k <= m + 1; k++){
                v[i][k] *= inmulteste;
                v[i][k] += v[inceput][k];
            }
        }
        inceput++;
    }
    //afis();

    bool ok = true;
    for(int i = n; i >= 1 && ok; i--){
        int cnt = 0,index;
        for(int j = 1; j <= m && ok; j++){
            if(abs(v[i][j]) > PRECIZIE){
                index = j;
                cnt++;
            }
            if(cnt > 1)
                ok = false;
        }
        if(viz[index]){
            if(abs(v[i][m + 1] - v[i][index]) > PRECIZIE){
                ok = false;
            }

        }else{
            //cout<<v[i][m + 1]<<" "<<v[i][index]<<endl;
            ld xj = v[i][m + 1] / v[i][index];
            ans[index] = xj;
            viz[index] = true;
            for(int linie = i - 1; linie >= 1 && ok; linie--){
                v[linie][m + 1] -= v[linie][index] * xj;
                v[linie][index] = 0;
            }
            //afis();
        }
    }

    if(!ok)
        out<<"Imposibil";
    else{
        for(int i = 1; i <= m; i++)
            out<<setprecision(13)<<fixed<<ans[i]<<" ";
    }
    return 0;
}