Cod sursa(job #1463583)

Utilizator TeodorescuStefanEduardTeodorescu Stefan Eduard TeodorescuStefanEduard Data 21 iulie 2015 12:06:32
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 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;
}