Cod sursa(job #2827597)

Utilizator AndoneAlexandruAndone Alexandru AndoneAlexandru Data 5 ianuarie 2022 22:19:41
Problema Algoritmul lui Gauss Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.72 kb
#include <iostream>
#include <iomanip>
using namespace std;

double** readSystem(int n, int m) {
    auto sys = new double*[n];
    for (int i = 0; i < n; ++i)
        sys[i] = new double[m + 1];

    for (int i = 0; i < n; ++i)
        for (int j = 0; j <= m; ++j)
            cin >> sys[i][j];

    return sys;
}

void multiplyLine(int m, double* line, double multiplier) {
    for (int i = 0; i <= m; ++i) {
        line[i] *= multiplier;
        if (line[i] == -0)
            line[i] = 0;
    }
}

void addLine(int m, double* line1, const double* line2, double multiplier) {
    for (int i = 0; i <= m; ++i)
        line1[i] += line2[i] * multiplier;
}

void printSystem(int n, int m, double** sys) {
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j <= m; ++j)
            cout << sys[i][j] << ' ';
        cout << '\n';
    }
    cout << '\n';
}

void solveSystem(int n, int m, double** sys) {
    multiplyLine(m, sys[0], (double)1/sys[0][0]);
    //printSystem(n, m, sys);
    for (int i = 1; i < n; ++i) {
        for (int j = 1; j <= i; ++j) {
            addLine(m, sys[i], sys[j - 1], -sys[i][j-1]);
            //printSystem(n, m, sys);
        }
        multiplyLine(m, sys[i], 1/sys[i][i]);
        //printSystem(n, m, sys);
    }
}

void printSolution(int n, int m, double** sys) {
    auto sol = new double[n];
    for (int i = n-1; i >= 0; --i) {
        sol[i] = sys[i][m];
        for (int j = i+1; j < m; ++j)
            sol[i] -= sys[i][j]*sol[j];
    }

    for (int i = 0; i < n; ++i)
        cout << fixed << setprecision(10) << sol[i] << ' ';

    delete[] sol;
}

int main() {
    int n, m;

    cin >> n >> m;
    double** sys = readSystem(n, m);
    solveSystem(n, m, sys);

    printSolution(n, m, sys);
    return 0;
}