Cod sursa(job #623450)

Utilizator rootsroots1 roots Data 19 octombrie 2011 22:11:40
Problema Algoritmul lui Gauss Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 2.29 kb
#include <fstream>
#include <iomanip>

#define EHeight 301
#define EWidth 302

#define vHeight 301
#define vWidth 302

#define XSize 301

using namespace std;

ifstream in;
ofstream out;

long double E[EHeight][EWidth];
double v[vHeight][vWidth];
double X[XSize];

int main()
{
    int M,N;

    in.open("gauss.in");

    in>>M>>N;
    for(int i=1;i<=M;++i)
        for(int j=1;j<=N+1;++j)
        {
            in>>E[i][j];
            v[i][j]=E[i][j];
        }

    in.close();

    out.open("gauss.out");

    for(int row=1,col=1;row<=M&&col<=N;++row,++col)
    {
        for(int pos;E[row][col]==0&&col<=N;++col)
        {
            pos=0;
            for(int i=row+1;i<=M;++i)
                if(E[i][col]!=0)
                {
                    pos=i;
                    break;
                }
            if(pos)
            {
                for(int j=col;j<=N+1;++j)
                {
                    double aux=E[row][j];
                    E[row][j]=E[pos][j];
                    E[pos][j]=aux;
                }
                break;
            }
        }

        if(col>N)
        {
            out<<"Imposibil\n";
            out.close();

            return 0;
        }

        for(int j=col+1;j<=N+1;++j)
            E[row][j]/=E[row][col];
        E[row][col]=1;

        for(int i=row+1;i<=M;++i)
            if(E[i][col]!=0)
            {
                for(int j=col+1;j<=N+1;++j)
                    E[i][j]-=E[row][j]*E[i][col];
                E[i][col]=0;
            }
    }

    for(int i=1;i<=N;++i) X[i]=0;

    for(int row=((M<N) ? M:N),col=N;row>0;--row,--col)
    {
        while(E[row][col]!=1&&col) --col;

        X[col]=E[row][N+1];
        for(int j=col+1;j<=N;++j)
            X[col]-=E[row][j]*X[j];
    }

    for(int end=((M<N)?N:M),i=((M<N)?M:N)+1;i<=end;++i)
    {
        double aux=0;
        for(int j=1;j<=N;++j) aux+=X[j]*v[i][j];
        aux-=v[i][N+1];
        if(aux>0.00000001||aux<-0.00000001)
        {
            out<<"Imposibil\n";
            out.close();

            return 0;
        }
    }

    out<<fixed;
    for(int i=1;i<N;++i)
        out<<setprecision(8)<<X[i]<<' ';
    out<<setprecision(8)<<X[N]<<'\n';

    out.close();

    return 0;
}