Cod sursa(job #1165691)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 2 aprilie 2014 20:48:06
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.99 kb
#include <fstream>
#include <iomanip>
#include <algorithm>
#include <cmath>

using namespace std;

int n,m;
double sol[305];
bool prost;

#define eps 0.0000000001

class sistem
{
public:
    double mat[305][305];

    void eliminare_gauss()
    {
        int i,j,det=0;

        for(j=1;j<=m;j++)
        {
            i=det+1;

            while(i<=n)
            {
                if(fabs(mat[i][j])>=eps)
                    break;
                i++;
            }

            if(i==(n+1))
                continue;
            det++;

            schimb(det,i);
            imp(det,mat[det][j]);

            for(i=det+1;i<=n;i++)
                scade(i,mat[i][j],det);
        }

        for(i=det+1;i<=n;i++)
            if(fabs(mat[i][j])>=eps)
            {
                prost=true;
                return;
            }

        double val;
        for(;det>=1;det--)
        {
            val=mat[det][m+1];
            for(j=1;j<=m;j++)
                val-=mat[det][j]*sol[j];
            sol[det]=val;
        }
    }

private:
    inline void schimb(int lin1,int lin2)
    {
        int i;
        for(i=1;i<=(m+1);i++)
            swap(mat[lin1][i],mat[lin2][i]);
    }

    inline void imp(int lin,double cat)
    {
        int i;
        for(i=1;i<=(m+1);i++)
            mat[lin][i]/=cat;
    }

    inline void scade(int lin1,double cat,int lin2)
    {
        int i;
        for(i=1;i<=(m+1);i++)
            mat[lin1][i]-=(cat*mat[lin2][i]);
    }
}x;

int main()
{
    ifstream cin("gauss.in");
    ofstream cout("gauss.out");

    int i,j;
    cin>>n>>m;
    m++;

    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            cin>>x.mat[i][j];
    m--;

    x.eliminare_gauss();

    if(prost)
    {
        cout<<"Imposibil\n";
        return 0;
    }

    for(i=1;i<=m;i++)
        cout<<fixed<<setprecision(10)<<sol[i]<<' ';
    cout<<'\n';

    cin.close();
    cout.close();
    return 0;
}