Cod sursa(job #2734855)

Utilizator dimi999Dimitriu Andrei dimi999 Data 1 aprilie 2021 15:24:15
Problema Algoritmul lui Gauss Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.69 kb
#include <bits/stdc++.h>
#define EPS 0.00000001
using namespace std;

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

int N, M;

double a[305][305], aux;

double vals[305];

int main()
{
    fin >> N >> M;

    for(int i = 1; i <= N; i++)
        for(int j = 1; j <= M + 1; j++)
            fin >> a[i][j];

    int li = 1, co = 1;

    while(li <= N && co <= M)
    {
        int i;

        for(i = li; i <= N; i++)
            if(a[i][co] < -EPS || a[i][co] > EPS)
                break;

        if(i == N + 1)
        {
            co++;
            continue;
        }

        if(i != li)
        {
            for(int j = 1; j <= M + 1; j++)
            {
                aux = a[i][j];
                a[i][j] = a[li][j];
                a[li][j] = aux;
            }
        }

        for(int j = li + 1; j <= M + 1; j++)
            a[li][j] /= a[li][co];
        a[li][co] = 1;

        for(int i = li + 1; i <= N; i++)
        {
            for(int j = co + 1; j <= M + 1; j++)
                a[i][j] -= a[i][co] * a[li][j];
            a[i][co] = 0;
        }

        ++li;
        ++co;
    }

    for(int i = N; i >= 1; i--)
        for(int j = 1; j <= M + 1; j++)
            if(a[i][j] > EPS || a[i][j] < -EPS)
    {
        if(j == M + 1)
        {
            fout << "Imposibil";
            return 0;
        }

        vals[j] = a[i][M + 1];

        for(int t = j + 1; t <= M; t++)
            if(a[i][t] > -EPS || a[i][t] < EPS)
                vals[j] -= vals[t] * a[i][t];

        break;
    }

    for(int i = 1; i <= M; i++)
        fout << fixed << setprecision(10) << vals[i] << ' ';

    return 0;
}