Cod sursa(job #708666)

Utilizator mihai995mihai995 mihai995 Data 7 martie 2012 01:42:09
Problema Algoritmul lui Gauss Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <fstream>
using namespace std;

const int N=105;
const double E=1e-10;
double v[N][N],rez[N];
int n,m;

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

inline double abs(double x)
{
    return x>0 ? x : -x;
}

inline bool zero(double x)
{
    return abs(x)<E;
}

inline void sch(double &a,double &b)
{
    double c=a;a=b;b=c;
}

void sch(double a[],double b[])
{
    for (int i=1;i<=m+1;i++)
        sch(a[i],b[i]);
}

int find(int x,int i)
{
    for (;i<=n;i++)
        if (!zero(v[i][x]))
            return i;
    return -1;
}

void reduce(double a[],double b[],double x)
{
    for (int i=1;i<=m+1;i++)
        a[i]-=x*b[i];
}

bool gauss()
{
    int L=1,i,j;
    for (i=1;i<=m;i++)
    {
        j=find(i,L);
        if (j==-1)
            continue;
        if (j!=L)
            sch(v[j],v[L]);
        double x=v[L][i];
        for (j=1;j<=m+1;j++)
            v[L][j]/=x;
        for (int j=1;j<=n;j++)
            if (j!=L)
                reduce(v[j],v[L],v[j][i]);
        L++;
    }
    for (i=1;i<=n;i++)
    {
        for (j=1;j<=m+1 && zero(v[i][j]);j++);
        if (j==m+1)
            return false;
        rez[j]=v[i][m+1];
    }
    return true;
}

int main()
{
    in>>n>>m;
    for (int i=1;i<=n;i++)
        for (int j=1;j<=m+1;j++)
            in>>v[i][j];
    if (!gauss())
    {
        out<<"Imposibil\n";
        return 0;
    }
    for (int i=1;i<=m;i++)
        out<<rez[i]<<" ";
    out<<"\n";
    return 0;
}