Cod sursa(job #1393487)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 19 martie 2015 14:45:41
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstdlib>

#define Nmax 305
#define EPS 0.000001

using namespace std;

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

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("%lf",&D[i][j]);
}

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

void Get_sol()
{
    int i,j,k,l;
    for(i = N; i >= 1; --i)
        for(j = 1; j <= M + 1; ++j)
        if(fabs(D[i][j]) > EPS)
        {
            if(j == M + 1){
                printf("Imposibil\n");
                exit(0);
            }
            X[i] = D[i][M+1];
            for(k = j + 1; k <= M; ++k)
                X[i] -= X[k]*D[i][k];
            X[i] /= D[i][j];
            break;
        }
    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;
}