Cod sursa(job #2070529)

Utilizator robx12lnLinca Robert robx12ln Data 19 noiembrie 2017 17:39:48
Problema Algoritmul lui Gauss Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include<fstream>
#include<iomanip>
using namespace std;
ifstream fin("gauss.in");
ofstream fout("gauss.out");
const double EPS = 1e-15;
int i, j, n, m;
double A[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 >> A[i][j];
    i = j = 1;
    while( i <= n && j <= m ){
        bool ok = false;
        for( int ii = i; ii <= n; ii++ ){
            if( A[ii][j] < -EPS || A[i][j] > EPS ){
                ok = true;
                if( ii != i )
                    for( int jj = 1; jj <= m + 1; jj++ )
                        swap( A[ii][jj], A[i][jj] );
                break;
            }
        }
        if( ok == false ){
            j++;
            continue;
        }
        for( int jj = j + 1; jj <= m + 1; jj++ )
            A[i][jj] /= A[i][j];
        A[i][j] = 1.0;
        for( int ii = i + 1; ii <= n; ii++ ){
            for( int jj = j + 1; jj <= m + 1; jj++ )
                A[ii][jj] -= A[ii][j] * A[i][jj];
            A[ii][j] = 0;
        }
        i++;
        j++;
    }
    for( int i = n; i >= 1; i-- ){
        int pos = 0;
        for( int j = 1; j <= m; j++ ){
            if( A[i][j] < -EPS || A[i][j] > EPS ){
                pos = j;
                break;
            }
        }
        if( pos == 0 ){
            fout << "Imposibil\n";
            return 0;
        }
        for( int j = pos + 1; j <= m; j++ )
            A[i][m + 1] -= A[i][j] * sol[j];
        sol[pos] = A[i][m + 1];
    }
    for( int i = 1; i <= m; i++ )
        fout << setprecision(10) << fixed << sol[i] << " ";
    return 0;
}