Cod sursa(job #794685)

Utilizator cbanu96Banu Cristian cbanu96 Data 6 octombrie 2012 20:26:37
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
#include <fstream>
#include <iomanip>

#define EPS 0.0000001
using namespace std;
int n, m, i, j, k, q, l, u;
double A[310][310];
double X[310], tmp;


int main()
{
    ifstream f("gauss.in");
    ofstream g("gauss.out");

    f >> n >> m;
    for ( i = 1; i <= n; ++i)
    {
        for ( j = 1; j <= m+1; ++j)
        {
            f >> A[i][j];
        }
    }
    i = 1, j = 1;
    while ( i <= n && j <= m)
    {
        for ( k = i; k <= n; ++k)
        {
            if(A[k][j] < - EPS || A[k][j] > EPS)
                break;
        }
        if ( k == n+1)
        {
            ++j;
            continue;
        }
        if ( k != i)
        {
            for ( l = 1; l <= m+1; l++)
            {
                tmp = A[i][l];
                A[i][l] = A[k][l];
                A[k][l] = tmp;
            }
        }
        for ( q = j+1; q <= m+1; ++q)
            A[i][q] = A[i][q] / A[i][j];
        A[i][j] = 1;

        for(int u = i+1; u <= n; ++u)
        {
            for(int l = j+1; l <= m+1; ++l)
                A[u][l] -= A[u][j] * A[i][l];
            A[u][j] = 0;
        }
        i++;
        j++;
    }
    for ( i = n; i > 0; i--)
    {
        for ( j = 1; j <= m+1; j++)
        {
            if(A[i][j] < - EPS || A[i][j] > EPS)
            {
                if(j == m+1)
                {
                    g << "Imposibil\n";
                    g.close();
                    return 0;
                }

                X[j] = A[i][m+1];
                for ( k = j+1; k <= m; k++)
                {
                    X[j] -= X[k] * A[i][k];
                }
                break;
            }
        }
    }
    g << fixed << setprecision(8);
    for ( i = 1; i <= m; i++)
        g << X[i] << ' ';
    g << '\n';
    f.close();
    g.close();
    return 0;
}