Cod sursa(job #3292253)

Utilizator stefan_dore_Stefan Dore stefan_dore_ Data 7 aprilie 2025 18:37:49
Problema Algoritmul lui Gauss Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.81 kb
#include <iostream>
#include <fstream>
#include <iomanip>
#include <cmath>
using namespace std;

ifstream f ("gauss.in");
ofstream g ("gauss.out");

const double EPS = 1e-10;
const int NMAX = 300;
int N, M;
double A[NMAX+1][NMAX+2], X[NMAX+1];

void Gauss() {
    int i=1, j=1, k, p;
    while(i <= N && j <= M) {
        if (abs(A[i][j]) <= EPS) {
            bool ok = 0;
            for (k = i+1; k<=N; k++)
                if (abs(A[k][j]) > EPS) {
                    ok = 1;
                    for (p = j; p <= M+1; p++)
                        swap(A[i][p], A[k][p]);
                    break;
                }
            //
            if (!ok) {
                j++;
                continue;
            }
        }
        //
        for (k=j+1; k<=M+1; k++)
            A[i][k] /= A[i][j];
        A[i][j] = 1.0;
        //
        for(k=i+1; k<=N; k++) {
            for(p=j+1; p<=M+1; p++)
                A[k][p] -= A[k][j] * A[i][p];
            A[k][j] = 0.0;
        }
        i++;
        j++;
    }
}

bool solutie() {
    for (int i=N; i>=1; i--)
        for(int j=i; j<=M+1; j++)
            if (abs(A[i][j]) > EPS) {
                if (j == M+1)
                    return 0;
                //
                X[j] = A[i][M+1];
                for(int k=j+1; k<=M; k++)
                    X[j] -= X[k] * A[i][k];
                break;
            }
    return 1;
}

void afisare() {
    for (int i=1; i<=M; i++)
        g << fixed << setprecision(10) << X[i] << ' ';
}

int main(){
    f >> N >> M;
    for (int i=1; i<=N; i++)
        for (int j=1; j<=M+1; j++)
            f >> A[i][j];
    //
    Gauss();
    //
    if (solutie())
        afisare();
    else
        g << "Imposibil";
    //
    f.close();
    g.close();
    return 0;
}