Cod sursa(job #1969843)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 18 aprilie 2017 17:56:57
Problema Algoritmul lui Gauss Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb
#include <bits/stdc++.h>
using namespace std;

fstream in ( "gauss.in" , ios::in  );
fstream out( "gauss.out", ios::out );

const int DIM = 3e2 + 5;
const double EPS = 1e-7;

double sys[DIM][DIM], ans[DIM];

inline int sign( double x ) {
    if( -EPS < x && x < EPS )
        return 0;
    else
        return ( x < 0 ) ? -1 : 1;
}

int main( void ) {
    
    int n, m;
    in >> n >> m;
    
    for( int i = 1; i <= n; i ++ )
        for( int j = 1; j <= m + 1; j ++ )
            in >> sys[i][j];
    
    for( int i = 1, j = 1; i <= n && j <= m; ) {
        bool ok = false;
        
        for( int k = i; k <= n; k ++ ) {
            if( sign( sys[k][j] ) != 0 ) {
                ok = true;
            
                for( int p = j; p <= m + 1; p ++ )
                    swap( sys[i][p], sys[k][p] );
            }
        }
        
        if( ok == false )
            j ++;
        else {
            for( int p = j + 1; p <= m + 1; p ++ )
                sys[i][p] /= sys[i][j];
            sys[i][j] = 1;
            
            for( int k = i + 1; k <= n; k ++ ) {
                for( int p = j + 1; p <= m + 1; p ++ )
                    sys[k][p] -= sys[i][p] * ( sys[k][j] / sys[i][j] );
                sys[k][j] = 0;
            }
            
            i ++; j ++;
        }
    }
    
    bool ok = true;
    for( int i = n, p = 1; i >= 1; i --, p = 1 ) {
        while( p <= m + 1 && sign( sys[i][p] ) == 0 )
            p ++;
        
        if( p == m + 2 )
            continue;
        
        if( p == m + 1 )
            ok = false;
        else {
            ans[p] = sys[i][m + 1];
            
            for( int j = p + 1; j <= m; j ++ )
                ans[p] -= ans[j] * sys[i][j];
        }
    }
    
    for( int i = 1; i <= m; i ++ )
        out << setprecision( 10 ) << fixed << ans[i] << " ";
    
    return 0;
}