Cod sursa(job #1450809)

Utilizator BLz0rDospra Cristian BLz0r Data 14 iunie 2015 19:23:53
Problema Algoritmul lui Gauss Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <cstdio>
#include <algorithm>
using namespace std;

#define Nmax 302
#define eps 1e-12

FILE *f = fopen ( "gauss.in", "r" );
FILE *g = fopen ( "gauss.out", "w" );

double a[Nmax][Nmax], sol[Nmax];
int N, M;

void swapline ( int x, int y ){
    for ( int i = 1; i <= M+1; ++i )
        swap ( a[x][i], a[y][i] );
}

int main(){

    fscanf ( f, "%d%d", &N, &M );

    for ( int i = 1; i <= N; ++i )
        for ( int j = 1; j <= M+1; ++j )
            fscanf ( f, "%lf", &a[i][j] );


    for ( int i = 1; i <= N; ++i ){

        for ( int j = i+1; j <= N; ++j ){
            if ( a[j][i] < -eps || a[j][i] > eps ){
                swapline ( i, j );
                break;
            }
        }

        double imp = a[i][i];
        for ( int j = i; j <= M+1; ++j ){
            a[i][j] /= imp;
        }

        for ( int j = i+1; j <= N; ++j ){
            imp = a[j][i];
            for ( int k = i; k <= M+1; ++k ){
                a[j][k] = a[j][k] - ( a[i][k] * imp );
            }
        }
    }


    for ( int i = N; i >= 1; --i ){

        bool onlyZero = 1;
        for ( int j = 1; j <= M; ++j ){
            if ( a[i][j] < -eps || a[i][j] > eps ){
                onlyZero = 0;
                break;
            }
        }
        if ( onlyZero && ( a[i][M+1] < -eps || a[i][M+1] > eps ) ){
            fprintf ( g, "Imposibil" );
            return 0;
        }

        double rez = a[i][M+1];
        for ( int j = M; j > i; --j )
            rez = rez - sol[j] * a[i][j];

        sol[i] = rez;
    }


    for ( int i = 1; i <= M; ++i )
        fprintf ( g, "%.10lf ", sol[i] );

    return 0;
}