Cod sursa(job #1148472)

Utilizator alex_HarryBabalau Alexandru alex_Harry Data 20 martie 2014 20:13:56
Problema Algoritmul lui Gauss Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <fstream>
#include <algorithm>
#include <iomanip>
#define EPS 0.00000001
using namespace std;
ifstream f("gauss.in");
ofstream g("gauss.out");
int N,M;
bool ok=1;
double A[305][305];
double X[305];
void Read()
{
    f>>N>>M;
    int i,j;
    for(i=1;i<=N;i++)
        for(j=1;j<=M+1;j++)
            f>>A[i][j];
}

void Print()
{
    for(int i=1;i<=M;i++)
        g<<fixed<<setprecision(10)<<X[i]<<" ";
    g<<"\n";
}

void Solve()
{
    int i=1,j=1;
    while(i<=N&&j<=M)
        {
            int k;
            for(k=i;(A[k][j]<EPS&&A[k][j]>-EPS)&&k<=N;k++);
            if(k==N+1)
            {
                j++;
                continue;
            }
            if(k!=i)
                swap(A[i],A[k]);

            for(k=i+1;k<=N;k++)
                {
                    for(int l=j+1;l<=M+1;l++)
                        A[k][l]=A[k][l]-A[i][l]*(A[k][j]/A[i][j]);
                    A[k][j]=0;
                }
        ++i;++j;
        }
    double S=0;
    for(i=N;i>=1;i--)
        {
            S=0;
            for(j=1;j<=M+1;j++)
                if(A[i][j]>EPS || A[i][j]<-EPS)
                    break;
            if(j==M+1)
            {
                g<<"Imposibil\n";
                ok=0;
                return;
            }
            if(j==M+2)
                continue;
            for(int k=j+1;k<=M;k++)
                S+=A[i][k]*X[k];
            X[i]=(A[i][M+1]-S)/A[i][i];
        }

}
int main()
{
    Read();
    Solve();
    if(ok==1)
        Print();
    return 0;
}