Cod sursa(job #1393460)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 19 martie 2015 14:27:23
Problema Algoritmul lui Gauss Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include <cstdio>
#include <algorithm>

#define Nmax 305
#define EPS 0.00000001

using namespace std;

double D[Nmax][Nmax],X[Nmax];
int N,M;

bool is_zero(double d)
{
    if(d < 0) d *= -1;
    if(d < EPS)
        return 1;
    return 0;
}

void swap_line(int A,int B)
{
    for(int i = 1; i <= M+1; ++i)
        swap(D[A][i],D[B][i]);
}

void Read()
{
    int aux;
    scanf("%d%d",&N,&M);
    for(int i = 1; i <= N; ++i)
        for(int j = 1; j <= M + 1; ++j){
            scanf("%d",&aux);
            D[i][j] = aux;
        }
}

void Killing_Gauss(){/// lol :D poor Gauss
    int i = 1,j = 1,k,l;
    for(int step = 1; step < N; ++step,++i,++j)
    {
        k = 1;
        while( k <= M && D[i][k] == 0 )
            ++k;
        if(k != j)
            swap_line(i,k);
        for(k = i + 1; k <= N; ++k)
        {
            double val = - D[k][j] / D[i][j];
            for(l = j; l <= M + 1; ++l)
            {
                D[k][l] += D[i][l] * val;
                if(is_zero(D[k][l]))
                    D[k][l] = 0;
            }
        }
    }
}

void Get_sol()
{
    for(int i = N; i >= 1; --i)
    {
        X[i] = D[i][M+1];
        for(int j = M; j >= i; --j)
        {
            if(j == i)
            {
                if(D[i][j])
                    X[i] /= D[i][j];
                else
                {
                    printf("Imposibil");
                    exit(0);
                }
                continue;
            }
            X[i] -= D[i][j] * X[j];
        }
    }
    double aux;
    for(int i = 1; i <= M; ++i)
    {
        aux = X[i];
        printf("%.10lf ",aux);
    }
}

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

    Read();
    Killing_Gauss();
    Get_sol();

    return 0;
}