Cod sursa(job #1247221)

Utilizator thewildnathNathan Wildenberg thewildnath Data 22 octombrie 2014 13:47:11
Problema Algoritmul lui Gauss Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.05 kb
#include<stdio.h>

#define NMAX 302
#define EPS 0.0000001

int n, m;
double a[NMAX][NMAX], v[NMAX][NMAX], sol[NMAX];

bool inline egal(double a, double b)
{
    if(a-EPS<b && a+EPS>b)
        return true;
    return false;
}

inline void imp(int lin, double val)
{
    for(int j=1; j<=m; ++j)
        v[lin][j]/=val;
    v[lin][m+1]/=val;
}

inline void schimba(int a, int b)
{
    if(a==b)return;

    int aux;

    for(int j=1; j<=m; ++j)
    {
        aux=v[a][j];
        v[a][j]=v[b][j];
        v[b][j]=aux;
    }
    aux=v[a][m+1];
    v[a][m+1]=v[b][m+1];
    v[b][m+1]=aux;
}

void inline elim(int a, int b, int x)
{
    for(int j=1; j<=m; ++j)
        v[a][j]-=v[b][j]*x;
    v[a][m+1]-=v[b][m+1]*x;
}

void Gauss()
{
    int x=1, y=1, lin;

    while(x<=n && y<=m)
    {
        for(lin=x; lin<=n; ++lin)
            if(!egal(v[lin][y], 0))
                break;

        if(lin<=n)
        {
            schimba(lin, x);

            imp(x, v[x][y]);

            for(int i=x+1; i<=n; ++i)
                elim(i, x, v[i][y]);

            ++x;
        }

        ++y;
    }
}

void Fin()
{
    for(int i=n; i; --i)
        for(int j=1; j<=m+1; ++j)
            if(v[i][j]>EPS || v[i][j]<-EPS)
            {
                if(j==m+1)
                {
                    printf("Imposibil\n");

                    return;
                }

                sol[j]=v[i][m+1];
                for(int k=j+1; k<=m; ++k)
                    sol[j]-=sol[k]*v[i][k];

                break;
            }

    for(int i=1; i<=m; ++i)
        printf("%.8lf ", sol[i]);
}

int main()
{
    freopen("gauss.in", "r", stdin);
    freopen("gauss.out", "w", stdout);

    scanf("%d%d", &n, &m);

    for(int i=1; i<=n; ++i)
    {
        for(int j=1; j<=m; ++j)
            scanf("%lf", &a[i][j]);
        scanf("%lf", &a[i][m+1]);

        for(int j=1; j<=m; ++j)
            v[i][j]=a[i][j];
        v[i][m+1]=a[i][m+1];
    }

    Gauss();

    Fin();

    return 0;
}