Cod sursa(job #1377809)

Utilizator Mr.DoomRaul Ignatus Mr.Doom Data 6 martie 2015 04:43:49
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <fstream>
#include <iomanip>
#include <cmath>
using namespace std;

#define eps 1E-8
#define MaxN 305

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

int n, m;
double x[MaxN];
double A[MaxN][MaxN];

void Calc();

int main()
{
    is >> n >> m;
    for ( int i = 1; i <= n; ++i )
        for ( int j = 1; j <= m + 1; ++j )
            is >> A[i][j];

    int i = 1, j = 1, k;
    double aux;

    while ( i <= n && j <= m )
    {
        for ( k = i; k <= n; ++k )
            if ( fabs(A[k][j]) > eps )
                break;
        if ( k == n + 1 )
        {
            j++;
            continue;
        }

        if(k != i)
           swap(A[i], A[k]);

        for ( k = j + 1; k <= m + 1; ++k )
            A[i][k] /= A[i][j];
        A[i][j] = 1;

        for ( int l = i + 1; l <= n; ++l )
        {
            for ( int c = j + 1; c <= m + 1; ++c )
                A[l][c] -= A[l][j] * A[i][c];
            A[l][j] = 0;
        }

        ++i;
        ++j;
    }

    Calc();


    is.close();
    os.close();
    return 0;
}

void Calc()
{
    for ( int i = n; i > 0; --i )
        for ( int j = 1; j <= m + 1; ++j )
            if ( fabs(A[i][j]) > eps )
            {
                if ( j == m + 1 )
                {
                    os << "Imposibil";
                    return;
                }

                x[j] = A[i][m + 1];
                for ( int k = j + 1; k <= m; ++k )
                    x[j] -= x[k] * A[i][k];

                break;
            }

    for ( int i = 1; i <= m; ++i )
        os << fixed << setprecision(10) << x[i] << ' ';
    return;
}