Cod sursa(job #3295672)

Utilizator alexdumitruAlexandru Dumitru alexdumitru Data 7 mai 2025 18:01:52
Problema Algoritmul lui Gauss Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.69 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <iomanip>

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

const int MAX_N = 300;
const int MAX_M = 300;
const double EPS = 1e-9;

int n, m;

double a[MAX_N + 1][MAX_M + 2];
double ans[MAX_M + 1];

void solve() {
    fin >> n >> m;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m + 1; j++)
            fin >> a[i][j];

    int i = 1, j = 1;

    while (i <= n && j <= m) {
        int line = 0;
        for (int k = i; k <= n; k++)
            if (std::abs(a[k][j]) > EPS)
                line = k;

        if (!line) {
            j++;
            continue;
        }

        for (int k = j; k <= m + 1; k++)
            std::swap(a[i][k], a[line][k]);

        for (int k = j + 1; k <= m + 1; k++)
            a[i][k] /= a[i][j];
        a[i][j] = 1;

        for (int k = i + 1; k <= n; k++) {
            for (int col = j + 1; col <= m + 1; col++)
                a[k][col] -= a[i][col] * a[k][j];
            a[k][j] = 0;
        }

        i++; j++;
    }

    for (int i = n; i >= 1; i--) {
        for (int j = 1; j <= m + 1; j++)
            if (std::abs(a[i][j]) > EPS) {
                if (j == m + 1) {
                    fout << "Imposibil\n";
                    exit(0);
                }

                ans[j] = a[i][m + 1];

                for (int k = j + 1; k <= m; k++)
                    ans[j] -= ans[k] * a[i][k];

                break;
            }
    }

    fout << std::fixed << std::setprecision(10);

    for (int i = 1; i <= m; i++)
        fout << ans[i] << ' ';
}

int main() {
    solve();
    return 0;
}