Cod sursa(job #1450819)

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

#define Nmax 302
#define eps 1e-10

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 ){
        bool swapped = 0;
        for ( int j = i; j <= N; ++j ){
            if ( fabs( a[j][i] ) > eps ){
                swapline ( i, j );
                swapped = 1;
                break;
            }
        }

        if ( !swapped )
            continue;

        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 ){
        double rez = a[i][M+1];
        for ( int j = M; j > i; --j )
            rez -= sol[j] * a[i][j];

        sol[i] = rez;
    }


    for ( int i = 1; i <= N; ++i ){
        double rez = 0;
        for  ( int j = 1; j <= M; ++j )
            rez += a[i][j] * sol[j];

        if ( fabs( rez - a[i][M+1] ) > eps ){
            fprintf ( g, "Imposibil" );
            return 0;
        }
    }

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

    return 0;
}