Cod sursa(job #623418)

Utilizator rootsroots1 roots Data 19 octombrie 2011 21:19:20
Problema Algoritmul lui Gauss Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.97 kb
#include <fstream>
#include <iomanip>

#define EHeight 301
#define EWidth 302

#define XSize 301

using namespace std;

ifstream in;
ofstream out;

double E[EHeight][EWidth];
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];

    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;
        if(col<1)
        {
            out<<"Imposibil\n";
            out.close();

            return 0;
        }

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

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

    out.close();

    return 0;
}