Cod sursa(job #1414660)

Utilizator Mihai22eMihai Ionut Enache Mihai22e Data 2 aprilie 2015 21:05:02
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.05 kb
#include <fstream>

#include <cstdio>
using namespace std;

const int MAX_N = 305;
const double EPS = 0.00000001;

int N, M;
double A[MAX_N][MAX_N], x[MAX_N];

inline int double_cmp(double a, double b) {
    if(a - b < -EPS) {
        return - 1;
    }

    if(a - b > EPS) {
        return 1;
    }

    return 0;
}

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 + 1; ++j) {
            scanf("%lf", &A[i][j]);
        }
    }

    int i = 1, j = 1;
    while(i <= N && j <= M) {
        int x = 0;

        for(int k = i; k <= N; ++k) {
            if(double_cmp(A[k][j], 0) != 0) {
                x = k;
                k = N;
            }
        }

        if(x == 0) {
            ++j;
            continue;
        }

        for(int h = 1; h <= M + 1; ++h) {
            swap(A[i][h], A[x][h]);
        }

        double tmp = A[i][j];
        for(int h = j; h <= M + 1; ++h) {
            A[i][h] /= tmp;
        }
        for(int k = i + 1; k <= N; ++k) {
            tmp = A[k][j];

            for(int h = j; h <= M + 1; ++h) {
                A[k][h] -= A[i][h] * tmp;
            }
        }
        ++i; ++j;
    }

    bool haveSol = 1;
    for(int i = N; i >= 1; --i) {
        bool ok = 0;

        for(int j = 1; j <= M && !ok; ++j) {
            if(double_cmp(A[i][j], 0)) {
                ok = 1;

                double tmp = A[i][M + 1];
                for(int h = j + 1; h <= M; ++h) {
                    tmp -= x[h] * A[i][h];
                }

                x[j] = tmp;
            }
        }

        if(!ok && double_cmp(A[i][M + 1], 0)) {
            haveSol = 0;
            break;
        }
    }

    if(haveSol) {
        for(int i = 1; i <= M; ++i) {
            printf("%.10lf ", x[i]);
        }
        printf("\n");
    }
    else printf("Imposibil\n");

    fclose(stdin);
    fclose(stdout);

    return 0;
}