Cod sursa(job #1162113)

Utilizator tzipleatudTudor Tiplea tzipleatud Data 31 martie 2014 17:18:37
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
#include <fstream>
#include <cstdlib>
#include <iomanip>
#include <cstring>
#include <cmath>
#define NM 310

using namespace std;

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

const double EPS=1e-10;

bool equal (double x, double y)
{
    return fabs(x-y)<EPS;
}

int N, M;
double A[NM][NM];
double X[NM];

void Read ()
{
    f >> N >> M;
    for (int i=1; i<=N; i++)
        for (int j=1; j<=M+1; j++)
            f >> A[i][j];

    f.close();
}

void Print (int ok)
{
    if (ok==0)
        g << "Imposibil";
    else
        for (int j=1; j<=M; j++)
            g << fixed << setprecision(100) << X[j] << ' ';

    g << '\n';
    g.close();

    exit(0);
}

void Modify ()
{

    for (int i=1, j=1; i<=N && j<=M; )
    {
        int l=0;
        for (l=i; l<=N; l++)
            if (!equal(A[l][j], 0.0))
                break;

        if (l>N)
        {
            j++;
            continue;
        }

        for (int c=1; c<=M+1; c++)
            swap(A[i][c], A[l][c]);

        double x=A[i][j];
        for (int c=1; c<=M+1; c++)
            A[i][c]/=x;

        for (l=i+1; l<=N; l++)
        {
            double x=A[l][j];
            for (int c=1; c<=M+1; c++)
                A[l][c]-=x*A[i][c];
        }

        i++;
        j++;
    }
}

void Solve ()
{
    for (int i=N; i>=1; i--)
    {
        int p=0;
        for (p=1; p<=M; p++)
            if (!equal(A[i][p], 0.0))
                break;

        if (p>M)
        {
            if (!equal(A[i][M+1], 0.0))
                Print(0);
            continue;
        }

        X[p]=A[i][M+1];
        for (int c=p+1; c<=M; c++)
            X[p]-=X[c] * A[i][c];
    }
}

int main ()
{
    Read();
    Modify();
    Solve();
    Print(1);

    return 0;
}