Cod sursa(job #1205561)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 7 iulie 2014 13:11:02
Problema Algoritmul lui Gauss Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstdlib>

#define Nmax 305
#define EPS 0.00000001

using namespace std;
double A[Nmax][Nmax];
double X[Nmax];
int N,M;

void read()
{
    scanf("%d%d",&N,&M);
    for(int i = 1; i <= N; ++i)
        for(int j = 1; j <= M + 1; ++j)
            scanf("%lf",&A[i][j]);
}
void swap_line(int i,int k)
{
    for(int j = 1; j <= M + 1; ++j)
        swap(A[i][j],A[k][j]);
}
void gauss()
{
    int i,j,k,l;
    double value;
    for(i = 1, j = 1; i <= N && j <= M; ++i,++j)
    {
        for(k = i; k <= N; ++k)
            if(A[k][j] > EPS || A[k][j] < - EPS)
                break;
        if(k == N + 1)continue;
        if(i != k) swap_line(i,k);
        for(k = i + 1; k <= N; ++k)
        {
            value = A[k][j]/A[i][j];
            for(l = j; l <= M + 1; ++l)
            {
                A[k][l] = A[k][l] - value * A[i][l];
                if( A[k][l] < EPS && A[k][l] > - EPS)
                    A[k][l] = 0;
            }
        }
    }
}

void get_answers()
{
    int i,j,k,l;
    for(i = N; i >= 1; --i)
    {
        for(j = 1; j <= M && !A[i][j]; ++j);
        if(j == M + 1){
            printf("Imposibil\n");
            exit(0);
        }
        X[i] = A[i][M+1];
        for(k = j + 1; k <= M; ++k)
            X[i] -= X[k]*A[i][k];
        X[i] /= A[i][j];
    }
}

void print_answers()
{
    for(int i = 1; i <= M; ++i){
        printf("%.8lf ",X[i]);
    }
}

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

    read();
    gauss();
    get_answers();
    print_answers();

    return 0;
}