Cod sursa(job #2471913)

Utilizator Vlad.Vlad Cristian Vlad. Data 11 octombrie 2019 18:47:00
Problema Algoritmul lui Gauss Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.01 kb
#include <fstream>
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
ifstream fin("gauss.in");
ofstream fout("gauss.out");
double a[305][305];
double x[305];
int n, m;
void citire() {
    fin >> n >> m;
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m + 1; ++j) {
            fin >> a[i][j];
        }
    }
}
void swapRows(int index1, int index2) {
    int aux;
    for (int j = 0; j < m + 1; ++j) {
        aux = a[index1][j];
        a[index1][j] = a[index2][j];
        a[index2][j] = aux;
    }
}
bool double_equals(double a, double b, double epsilon = 0.00000000001)
{
    return abs(a - b) < epsilon;
}
void gaussAlgorithm() {
    int i = 0, j = 0;
    while (i < n && j < m) {
        int iNenul = i;
        while (iNenul < n && double_equals(a[iNenul][j], 0)) {
            ++iNenul;
        }
        if (iNenul == n) {
            ++j;
        }
        else {
            if (iNenul != i)
                swapRows(iNenul, i);
            for (int k = i + 1; k < n; ++k) {
                double r = a[k][j] /a[i][j];
                a[k][j] = 0;
                for (int l = j + 1; l <= m; ++l) {
                    a[k][l] = a[k][l] - a[i][l] * r;
                }
            }
            i++;
            j++;
        }
    }
}
void afisare() {
    fout << fixed << setprecision(10);
    for (int i = 0; i < m; ++i) {
        fout << x[i] << " ";
    }
}
void getUnknownValues() {
    for (int i = n - 1; i >= 0; --i) {
        int jNenul = 0;
        while (jNenul < m && double_equals(a[i][jNenul], 0)) {
            ++jNenul;
        }
        if (jNenul == m && !double_equals(a[i][m], 0)) {
            fout << "Imposibil\n";
            return;
        }
        for (int j = jNenul + 1; j < m; ++j) {
            a[i][m] -= x[j] * a[i][j];
        }
        x[jNenul] = a[i][m] / a[i][jNenul];
    }
     afisare();
}
int main()
{
    citire();
    gaussAlgorithm();
    getUnknownValues();
    return 0;
}