Cod sursa(job #1424041)

Utilizator dutzulBodnariuc Dan Alexandru dutzul Data 23 aprilie 2015 11:54:35
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
//#include <iostream>
#include <fstream>

using namespace std;

ifstream f("gauss.in");
ofstream g("gauss.out");

#define eps ((db)0.0000000000001)
#define LE 306
#define db double
#include <iomanip>
#define cout g

bool comisie;
db a[LE][LE];
int pos[LE];
db result[LE];


bool gauss(int n,int m)
{
    int nr_piv=0,i,j,t;

    for(i=1; i<=m; ++i)
    {
        int ind_lin=0;

        for(j=nr_piv+1; j<=n; ++j)
            if (a[j][i]>eps||a[j][i]<-eps)
            {
                ind_lin=j;
                break;
            }

        if (ind_lin==0) continue;

        ++nr_piv;

        for(j=1; j<=m+1; ++j)
            swap(a[nr_piv][j],a[ind_lin][j]);

        for(j=1; j<=n; ++j)
            if (j!=nr_piv)
                if(a[j][i]>eps||a[j][i]<-eps)
                {
                    db D=a[j][i]/a[nr_piv][i];

                    for(t=1; t<=m+1; ++t)
                        a[j][t]-=a[nr_piv][t]*D;
                }

        pos[nr_piv]=i;
    }

    for(i=nr_piv+1; i<=n; ++i)
        if (a[i][m+1])
            return false;

    for(i=1; i<=nr_piv; ++i)
        result[pos[i]]=a[i][m+1]/a[i][pos[i]];

    return true;
}


int main()
{
    int n,m,j,i;
    f>>n>>m;

    for(i=1; i<=n; ++i)
    {
        for(j=1; j<=m+1; ++j)
            f>>a[i][j];
    }

    if (gauss(n,m)==false)
    {
        cout<<"Imposibil";
        return 0;
    }

    cout<<fixed;
    cout<<setprecision(10);

    for(i=1; i<=m; ++i)
        cout<<result[i]<<" ";

    return 0;
}