Cod sursa(job #2887131)

Utilizator toma_ariciuAriciu Toma toma_ariciu Data 8 aprilie 2022 21:38:17
Problema Algoritmul lui Gauss Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.69 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <iomanip>
#include <algorithm>

using namespace std;

const string filename = "gauss";
ifstream fin(filename + ".in");
ofstream fout(filename + ".out");

const double eps = 1e-8;
int n, m;
double ec[305][305], sol[305];

int main()
{
    fin >> n >> m;
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m + 1; j++)
            fin >> ec[i][j];
    int i = 1, j = 1, k;
    while(i <= n && j <= m)
    {
        for(k = i; k <= n; k++)
            if(ec[k][j] < -eps || ec[k][j] > eps)
                break;
        if(k == n + 1)
        {
            j++;
            continue;
        }
        for(int poz = 1; poz <= m + 1; poz++)
            swap(ec[k][poz], ec[i][poz]);
        for(k = j + 1; k <= m + 1; k++)
            ec[i][k] = ec[i][k] / ec[i][j];
        ec[i][j] = 1;
        for(k = i + 1; k <= n; k++)
        {
            for(int l = j + 1; l <= m + 1; l++)
                ec[k][l] -= ec[k][j] * ec[i][l];
            ec[k][j] = 0;
        }
        i++, j++;
    }
    for(i = n; i; i--)
    {
        for(j = 1; j <= m + 1; j++)
        {
            if(ec[i][j] > eps || ec[i][j] < -eps)
            {
                if(j == m + 1)
                {
                    fout << "Imposibil";
                    return 0;
                }
                sol[j] = ec[i][m + 1];
                for(k = j + 1; k <= m; k++)
                    sol[j] -= sol[k] * ec[i][k];
                break;
            }
        }
    }
    fout << fixed << setprecision(8);
    for(int i = 1; i <= m; i++)
        fout << sol[i] << ' ';
    return 0;
}