Cod sursa(job #1708791)

Utilizator UPB_Darius_Rares_SilviuPeace my pants UPB_Darius_Rares_Silviu Data 27 mai 2016 22:58:57
Problema Algoritmul lui Gauss Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.98 kb
#include <cstdio>
#include <cmath>
#include <algorithm>
#define NMax 310

using namespace std;

int N, M;
double a[NMax][NMax];
double x[NMax];
bool sol = true;

bool zero( double val ) {
    return fabs(val) < 0.1;
}

void gauss() {
    if (N < M) {
        sol = false;
        return;
    }
    int imax = min(N, M);
    for ( int i = 1; i <= imax; ++ i ) {

        int max_k = i;
        double max_val = 0;
        for ( int k = i; k <= N; ++ k ) {
            if ( fabs(a[k][i]) > max_val ) {
                max_k = k;
                max_val = fabs(a[k][i]);
            }
        }

        if ( i != max_k ) {
            for ( int k = 1; k <= M + 1; ++ k) {
                swap(a[i][k], a[max_k][k]);
            }
        }

        double x = a[i][i];
        for ( int k = i + 1; k <= N; ++ k ){
                double y = a[k][i];
                for ( int j = i; j <= M + 1; ++ j ) {
                    a[k][j] = a[k][j]  - a[i][j] * y / x;
                }
                a[k][i] = 0;
        }
    }

//    for (int i = 1; i <= M; ++i) {
//        for (int j  = 1 ; j <= M; ++j) {
//            if (j < i) {
//                printf("%.10f ", 0);
//            } else {
//                printf("%.10f ", a[i][j]);
//            }
//        }
//        printf("\n");
//    }

    for (int i = M; i >= 0; --i) {
        double s = 0;
        for (int k = i + 1; k <= M; ++k) {
            s += a[i][k] * x[k];
        }
        x[ i ] = 1.0 * (a[i][M + 1] - s) / a[i][i];
    }

}


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]);

    gauss();

    if ( ! sol ) {
        printf("Imposibil\n");
        return 0;
    }

    for ( int i = 1; i <= M; ++ i )
        printf("%.10lf ", x[i]);
    printf("\n");

    return 0;
}