Cod sursa(job #1414016)

Utilizator retrogradLucian Bicsi retrograd Data 2 aprilie 2015 11:48:32
Problema Algoritmul lui Gauss Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.91 kb
#include<fstream>
#include<vector>
#include<cmath>
#include<iomanip>

using namespace std;
typedef int var;

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

#define MAXN 500
#define eps 1e-8
#define eq(a, b) (fabs(a-b)<eps)

var m, n;
double **A, **B;
double *X;

void read() {
    fin>>n>>m;
    A = new double*[n+1];
    B = new double*[n+1];
    X = new double[n+1];
    for(var i=1; i<=n; i++) {
        A[i] = new double[m+2];
        B[i] = new double[m+2];
    }

    for(var i=1; i<=n; i++) {
        for(var j=1; j<=m+1; j++) {
            fin>>A[i][j];
            B[i][j] = A[i][j];
        }
    }
}

bool diag() {
    for(var step=1; step<=n; step++) {
        if(eq(B[step][step], 0)) {
            var i;
            for(i=step+1; i<=n && eq(B[i][step], 0); i++);

            if(i > n) return false;

            swap(B[i], B[step]);
        }

        for(var i=step+1; i<=m+1; i++) {
            B[step][i] /= B[step][step];
        }
        B[step][step] = 1;

        B[step][step] = 1;

        for(var i=step+1; i<=n; i++) {
            var inm = B[i][step];
            for(var j=step; j<=m+1; j++) {
                B[i][j] -= B[step][j] * inm;
            }
        }

    }

    return true;
}

void findX() {
    for(var i=n; i>=1; i--) {
        double rez = B[i][m+1];
        for(var j=m; j>i; j--) {
            rez -= B[i][j]*X[j];
        }
        X[i] = rez;
    }
}

int main() {

    read();
    if(!diag()) {
        fout<<-1;
        return 0;
    }

    findX();

    for(var i=1; i<=n; i++) {
        double rez = 0;
        for(var j=1; j<=m; j++) {
            rez += A[i][j] * X[j];
        }
        if(!eq(rez, A[i][m+1])) {
            fout<<-1;
            return 0;
        }
    }

    fout<<fixed<<setprecision(10);

    for(var i=1; i<=n; i++) {
        fout<<X[i]<<" ";
    }

    return 0;
}