Cod sursa(job #2629898)

Utilizator StanCatalinStanCatalin StanCatalin Data 23 iunie 2020 10:56:32
Problema Algoritmul lui Gauss Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.84 kb
#include <iostream>
#include <fstream>
#include <iomanip>

using namespace std;

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

const int dim = 305;
const double eps = 0.00000001;

int n,m;
double a[dim][dim],x[dim];

bool Gauss()
{
    int ec = 1;
    int var = 1;
    while (ec <= n && var <= m)
    {
        int cec = ec;
        for (cec=ec; cec <= n; cec++)
        {
            if (a[cec][var] < -eps || a[cec][var] > eps)
            {
                break ;
            }
        }
        if (cec == n+1)
        {
            var++;
            continue ;
        }
        if (cec != ec)
        {
            swap(a[cec],a[ec]);
        }
        for (int j=var+1; j<=m+1; j++)
        {
            a[ec][j] /= a[ec][var];
        }
        a[ec][var] = 1;
        for (int i=ec+1; i<=n; i++)
        {
            for (int j=var+1; j<=m+1; j++)
            {
                a[i][j] -= a[i][var] * a[ec][j];
            }
            a[i][var] = 0;
        }
        ec++;
        var++;
    }
    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) return 0;
                x[j] = a[i][m+1];
                for (int w=j+1; w<=m; w++)
                {
                    x[j] -= x[w] * a[i][w];
                }
                break;
            }
        }
    }
    return 1;
}

int main()
{
    in >> n >> m;
    for (int i=1; i<=n; i++)
    {
        for (int j=1; j<=m+1; j++)
        {
            in >> a[i][j];
        }
    }
    if (!Gauss())
    {
        out << "Imposibil";
    }
    else
    {
        for (int i=1; i<=m; i++)
        {
            out << fixed << setprecision(10) << x[i] << " ";
        }
    }
    return 0;
}