Cod sursa(job #1399343)

Utilizator nicol.bolasNicol Bolas nicol.bolas Data 24 martie 2015 18:25:05
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include<fstream>
#include<iomanip>
using namespace std;
#define EPS 0.00000001
ifstream fin("gauss.in");
ofstream fout("gauss.out");
int n,m;
double aux,A[305][305],X[305];
bool ok=true;
string IMP="Imposibil";
int main()
{
    int i,j,k,ii;
    fin>>n>>m;
    for (i=1;i<=n;++i)
        for (j=1;j<=m+1;++j)
            fin>>A[i][j];
    i=1, j=1;
    while (i<=n)
    {
        for (k=j;k<=m;++k)
            if (!(-EPS<A[i][k] && A[i][k]<EPS))
                break;
        if (k>m+1)
        {
            ++j;
            continue;
        }
        if (k==m+1)
            break;
        if (k>j)
        {
            for (k=i+1;k<=n;++k)
                if (!(-EPS<A[k][j] && A[k][j]<EPS))
                    break;
            for (ii=j;ii<=m+1;++ii)
                aux=A[k][ii], A[k][ii]=A[i][ii], A[i][ii]=aux;
        }
        for (k=j+1;k<=m+1;++k)
            A[i][k]/=A[i][j];
        A[i][j]=1;
        for (k=i+1;k<=n;++k)
            if (!(-EPS<A[k][j] && A[k][j]<EPS))
            {
                for (ii=j+1;ii<=m+1;++ii)
                    A[k][ii]-=A[k][j]*A[i][ii];
                A[k][j]=0;
            }
        ++i, ++j;
    }
    for (i=n;i>0 && ok;--i)
    {
        for (j=1;j<=m+1;++j)
            if (!(-EPS<A[i][j] && A[i][j]<EPS))
                break;
        if (j==m+1)
        {
            ok=false;
            continue;
        }
        if (j>m+1)
            continue;
        X[j]=A[i][m+1];
        for (k=j+1;k<=m;++k)
            X[j]-=X[k]*A[i][k];
    }
    if (!ok)
        fout<<IMP;
    else
        for (i=1;i<=m;++i)
            fout<<setprecision(8)<<fixed<<X[i]<<" ";
    fout<<"\n";
    return 0;
}