Cod sursa(job #1970334)

Utilizator robx12lnLinca Robert robx12ln Data 19 aprilie 2017 11:20:26
Problema Algoritmul lui Gauss Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.84 kb
#include<fstream>
#include<iomanip>
#define EPS 1e-7
using namespace std;
ifstream fin("gauss.in");
ofstream fout("gauss.out");
int n, m;
double ec[305][305], sol[305];
int main(){

    fin >> n >> m;
    for( int i = 1; i <= n; i++ ){
        for( int j = 1; j <= m + 1; j++ ){
            fin >> ec[i][j];
        }
    }

    for( int i = 1, j = 1; i <= n && j <= m; ){

        int ok = 0;

        for( int ii = i; ii <= n; ii++ ){
            if( !( -EPS < ec[ii][j] && ec[ii][j] < EPS ) ){
                ok = 1;
                if( ii != i )
                    for( int jj = j; jj <= m; jj++ ){
                        swap( ec[ii][jj], ec[i][jj] );
                    }
                break;
            }
        }

        if( ok == 0 ){
            j++;
            continue;
        }

        for( int jj = j + 1; jj <= m + 1; jj++ ){
            ec[i][jj] /= ec[i][j];
        }
        ec[i][j] = 1.0;

        for( int ii = i + 1; ii <= n; ii++ ){
            for( int jj = j + 1; jj <= m + 1; jj++ ){
                ec[ii][jj] -= ec[i][jj] * ec[ii][j];
            }
            ec[ii][j] = 0.0;
        }

        i++;
        j++;

    }

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

        int p = 0;
        for( int j = 1; j <= m; j++ ){
            if( !( -EPS < ec[i][j] && ec[i][j] < EPS ) ){
                p = j;
                break;
            }
        }

        if( p == 0 && ( -EPS < ec[i][m + 1] && ec[i][m + 1] < EPS ) ){
            fout << "Imposibil\n";
            return 0;
        }

        sol[p] = ec[i][m + 1] / ec[i][p];

        for( int ii = i - 1; ii >= 1; ii-- ){
            ec[ii][m + 1] -= sol[p] * ec[ii][p];
        }

    }

    for( int i = 1; i <= m; i++ ){
        fout << setprecision(10) << fixed << sol[i] << " ";
    }

    return 0;
}