Cod sursa(job #3262937)

Utilizator gBneFlavius Andronic gBne Data 12 decembrie 2024 11:58:25
Problema Algoritmul lui Gauss Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <fstream>
#include <iostream>
#include <iomanip>

using namespace std;

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

bool zeroAcc(double x){
    return (x > -1e-8) && (x < 1e-8);
}

double A[305][305];
int rez[305];

int main()
{
    int N, M;
    fin >> N >> M;
    ++ M;
    for(int i = 1; i <= N; ++ i){
        for(int j = 1; j <= M; ++ j){
            fin >> A[i][j];
        }
    }
    int r = 1, c = 1;
    while(r <= N && c < M){
        if(zeroAcc(A[r][c])){
            int i = r + 1;
            while(i <= N && zeroAcc(A[i][c])){
                ++ i;
            }
            if(i > N){
                ++ c;
                continue;
            }
            swap(A[r], A[i]);
        }
        // cout << r << ' ' << c << '\n';
        if(rez[c] != -1){
            for(int i = 1; i <= N; ++ i){
                if(i != r){
                    double coef = A[i][c] * 1.0 / A[r][c];
                    for(int j = 1; j <= M; ++ j){
                        A[i][j] -= coef * 1.0 * A[r][j];
                    }
                }
            }
            rez[c] = r;
            ++ r;
            ++ c;
        }
    }
    if(c > M){
        for(int i = r; i <= N; ++ i){
            if(!zeroAcc(A[i][M])){
                fout << "Imposibil\n";
                return 0;
            }
        }
    }
    for(int i = 1; i < M; ++ i){
        if(A[rez[i]][M] == 0){
            fout << 0 << ' ';
        } else {
            fout << setprecision(10) << A[rez[i]][M] * 1.0 / A[i][i] << ' ';
        }
    }
    return 0;
}