Cod sursa(job #2730164)

Utilizator DavidLDavid Lauran DavidL Data 25 martie 2021 21:02:32
Problema Algoritmul lui Gauss Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.05 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fi("gauss.in");
ofstream fo("gauss.out");

const int NMAX = 305;

int n, m;
long double A[NMAX][NMAX];
long double sol[NMAX];

void afis() {
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m + 1; j++)
            cout << A[i][j] << " ";
        cout << "\n";
    }
    cout << "\n";
}

void swapLinii(int a, int b) {
    for (int j = 1; j <= m + 1; j++)
        swap(A[a][j], A[b][j]);
}

void redu() {
    int i = 1, j = 1;
    while (i <= n && j <= m) {
        // caut prima linie care are ceva pe j
        int i2 = i;
        while (i2 <= n && A[i2][j] == 0)
            i2++;
        if (i2 > n) {
            j++;
            continue;
        }

        swapLinii(i, i2);

        long double coef = A[i][j];
        for (int j2 = j; j2 <= m + 1; j2++)
            A[i][j2] /= coef;

        // le nulizez pe celelalte
        for (int i2 = i + 1; i2 <= n; i2++) {
            long double coef = A[i2][j];
            for (int j2 = j; j2 <= m + 1; j2++)
                A[i2][j2] -= A[i][j2] * coef;
        }

        i++; j++;
    }
}

void rezolva() {
    for (int i = n; i >= 1; i--) {
        int pr = 1;
        while (A[i][pr] == 0 && pr <= m)
            pr++;
        if (pr > m)
            break;

        sol[pr] = A[i][m + 1];
        for (int j = pr + 1; j <= m; j++)
            sol[pr] -= A[i][j] * sol[j];
    }
}

bool verif() {
    for (int i = 1; i <= n; i++) {
        long double sum = 0;
        for (int j = 1; j <= m; j++)
            sum += sol[j] * A[i][j];
        if (abs(sum - A[i][m + 1]) >= 1e-7)
            return 0;
    }
    return 1;
}

int main()
{
    fi >> n >> m;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m + 1; j++)
            fi >> A[i][j];
    }

    redu();
    rezolva();
    if (!verif()) {
        fo << "Imposibil";
        return 0;
    }

    for (int i = 1; i <= m; i++)
        fo << fixed << setprecision(10) << sol[i] << " ";

    return 0;
}