Cod sursa(job #2232195)

Utilizator HumikoPostu Alexandru Humiko Data 17 august 2018 19:00:42
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.89 kb
#include <bits/stdc++.h>
#define lim 0.0000001

using namespace std;

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

int n, m;
double answer[305];
double v[305][305];

int main()
{
    ios::sync_with_stdio(false);
    fin.tie(0); fout.tie(0);

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

    int i = 1;
    int j = 1;

    while ( i <= n && j <= m )
    {
        int x;
        bool swapped = false;

        for ( x = i; x <= n; ++x )
        {
            if ( v[x][j] >= lim || v[x][j] <= -lim )
            {
                swapped = true;
                break;
            }
        }

        if ( swapped )
        {
            double auxiliary_Value;

            for ( int k = j; k <= m+1; ++k )
                swap(v[i][k], v[x][k]);

            auxiliary_Value = v[i][j];

            for ( int k = j; k <= m+1; ++k )
                v[i][k] /= auxiliary_Value;

            for ( int u = i+1; u <= n; ++u )
            {
                auxiliary_Value = v[u][j];

                for ( int k = j; k <= m+1; ++k )
                    v[u][k] -= auxiliary_Value*v[i][k];
            }

            i++;
            j++;
        }
        else
            j++;
    }

    for ( i = n; i >= 1; --i )
    {
        for ( j = 1; j <= m+1; ++j )
        {
            if ( v[i][j] >= lim || v[i][j] <= -lim )
            {
                if ( j == m+1 )
                {
                    fout<<"Imposibil"<<'\n';
                    return 0;
                }

                answer[j] = v[i][m+1];

                for ( int k = m; k > j; --k )
                    answer[j] -= v[i][k]*answer[k];

                break;
            }
        }
    }

    for ( i = 1; i <= m; ++i )
        fout<<fixed<<setprecision(12)<<answer[i]<<" ";
}