Cod sursa(job #1214452)

Utilizator acomAndrei Comaneci acom Data 30 iulie 2014 14:49:37
Problema Algoritmul lui Gauss Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include<fstream>
#include<iomanip>
using namespace std;
#define EPS 0.00000001
ifstream fin("gauss.in");
ofstream fout("gauss.out");
int n,m,ok;
double aux,A[305][305],X[305];
int main()
{
    int i,j,k,t;
    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 && j<=m)
    {
        for (k=j;k<=m+1;++k)
            if (A[i][k]!=0)
                break;
        if (k>m+1)
        {
            ++j;
            continue;
        }
        if (k==m+1)
            break;
        if (k>j)
        {
            for (t=i+1;t<=n;++t)
                if (A[t][j]!=0)
                    break;
            for (t=i;i<=m+1;++t)
                aux=A[k][t], A[k][t]=A[i][t], A[i][t]=aux;
        }
        for (t=i+1;t<=m+1;++t)
            A[i][t]/=A[i][j];
        A[i][j]=1;
        for (k=i+1;k<=n;++k)
        {
            for (t=j+1;t<=m+1;++t)
                A[k][t]-=A[i][t]*A[k][j];
            A[k][j]=0;
        }
        ++i, ++j;
    }
    for (i=n,j=m;i && !ok;--i)
    {
        for (j=1;j<=m+1;++j)
            if (A[i][j]<-EPS || A[i][j]>EPS)
                break;
        if (j==m+1)
            ok=-1;
        X[j]=A[i][m+1];
        for (k=j+1;k<=m;++k)
            X[j]-=A[i][k]*X[k];
    }
    if (ok)
        fout<<"Imposibil";
    else
        for (i=1;i<=m;++i)
            fout<<setprecision(10)<<fixed<<X[i]<<" ";
    fout<<"\n";
    return 0;
}