Cod sursa(job #3353107)

Utilizator EricDimiCismaru Eric-Dimitrie EricDimi Data 4 mai 2026 19:18:12
Problema Algoritmul lui Gauss Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.91 kb
#include <fstream>
#include <cstdlib>
#include <iomanip>
#include <cmath>

using namespace std;

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

const int DMAX = 300;
const double EPS = 1e-10;

double A[DMAX + 1][DMAX + 1],
       x[DMAX + 1];
int N, M;

void ReadCoeff()
{
    f >> N >> M;
    for(int i = 1; i <= N; i++)
        for(int j = 1; j <= M + 1; j++)
            f >> A[i][j];
}

void Gauss()
{
    int row = 1, col = 1;
    while(row <= N && col <= M)
    {
        int pivot = row;
        while(pivot <= N && fabs(A[pivot][col]) < EPS)
            pivot++;
        if(pivot == N + 1)
        {
            col++;
            continue;
        }
        if(row != pivot)
            for(int i = 1; i <= M + 1; i++)
                swap(A[row][i], A[pivot][i]);
        for(int i = col + 1; i <= M + 1; i++)
            A[row][i] /= A[row][col];
        A[row][col] = 1;
        for(int i = row + 1; i <= N; i++)
        {
            for(int j = col + 1; j <= M + 1; j++)
                A[i][j] -= A[row][j] * A[i][col];
            A[i][col] = 0;
        }
        row++;
        col++;
    }
}

void Calc()
{
    for(int i = N; i >= 1; i--)
        for(int j = 1; j <= M + 1; j++)
            if(fabs(A[i][j]) > EPS)
            {
                if(j == M + 1)
                {
                    g << "Imposibil\n";
                    f.close();
                    g.close();
                    exit(0);
                }
                x[j] = A[i][M + 1];
                for(int k = j + 1; k <= M; k++)
                    x[j] -= x[k] * A[i][k];
                break;
            }
}

void WriteSol()
{
    g << fixed << setprecision(10);
    for(int i = 1; i <= M; i++)
        g << x[i] << ' ';
    g << '\n';
}

int main()
{
    ReadCoeff();
    Gauss();
    Calc();
    WriteSol();
    f.close();
    g.close();
    return 0;
}