Cod sursa(job #673812)

Utilizator ciuscatalincius catalin ciuscatalin Data 4 februarie 2012 22:03:37
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.16 kb
#include <fstream>
#include <iomanip>
#define EHeight 301
#define EWidth 302
#define XSize 301
#define EPS 0.00000001
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]-=E[row][N+1]*E[i][col];
            }
    }

    for(int i=1;i<=N;++i) X[i]=0;
    for(int row=M,col=N;row>0;--row,--col)
    {
        while(E[row][col]!=1&&col) --col;
        if(col<1)
        {
            if(E[row][N+1]>EPS||E[row][N+1]<-EPS)
            {
                out<<"Imposibil\n";
                out.close();

                return 0;
            }
            else
            {
                col=N+1;
                continue;
            }
        }

        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;
}