Cod sursa(job #3304062)

Utilizator unomMirel Costel unom Data 20 iulie 2025 10:55:22
Problema Algoritmul lui Gauss Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.06 kb
#include <fstream>
#include <iomanip>
#include <cmath>

using namespace std;

ifstream in("gauss.in");
ofstream out("gauss.out");
int n, m;
long double v[305][305];
long double ans[305];
long double err=1e-17;

void show()
{
    for(int i = 1; i<=n; i++)
    {
        for(int j = 1; j<=m + 1; j++)
        {
            out<<v[i][j]<<" ";
        }
        out<<'\n';
    }
    out<<'\n';
}

int main()
{
    in>>n>>m;

    for(int i = 1; i<=n; i++)
    {
        for(int j = 1; j<=m + 1; j++)
        {
            in>>v[i][j];
        }
    }

    //show();

    int lin = 1;
    for(int j = 1; j<=m && lin <= n; j++, lin++)
    {
        int gasit = 0;
        for(int i = lin; i<=n; i++)
        {
            if(v[i][j] != 0)
            {
                gasit = i;
                break;
            }
        }

        if(gasit == 0)
        {
            ans[j] = 0;
            continue;
        }

        swap(v[lin], v[gasit]);

        long double x = v[lin][j];
        for(int j1 = 1; j1<=m + 1; j1++)
        {
            v[lin][j1] /= x;
        }

        for(int i1 = lin + 1; i1<=n; i1++)
        {
            x = v[i1][j];
            for(int j1 = 1; j1<=m + 1; j1++)
            {
                v[i1][j1] -= (long double)x * v[lin][j1];
            }
        }

        //show();
    }

    for(int i = n; i>=1; i--)
    {
        int ok = 0;
        for(int j = 1; j<=m; j++)
        {
            if(v[i][j] != 0)
            {
                ok = 1;
                long double rez = v[i][m + 1];

                for(int j1 = j + 1; j1<=m; j1++)
                {
                    rez -= (long double)v[i][j1] * ans[j1];
                }

                ans[j] = rez;
                break;
            }
        }

        if(ok == 0 && fabs(v[i][m + 1]) > err)
        {
            out<<"Imposibil";

            return 0;
        }
    }

    for(int i = 1; i<=m; i++)
    {
        out<<setprecision(10)<<fixed<<ans[i]<<" ";
    }

    return 0;
}