Cod sursa(job #3297768)

Utilizator Arhiva_EducationalaArhiva Educationala Arhiva_Educationala Data 23 mai 2025 19:04:47
Problema Algoritmul lui Gauss Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.84 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX = 300;
const double EPS = 0.000001;

double a[NMAX][NMAX + 1];
double ans[NMAX];

bool isZero( double a ) {
    return abs( a ) <= EPS;
}
int main() {
    ifstream fin( "gauss.in" );
    ofstream fout( "gauss.out" );
    int n, m;
    fin >> n >> m;
    for ( int i = 0; i < n; i ++ ) {
        for ( int j = 0; j <= m; j ++ ) {
            fin >> a[i][j];
        }
    }
    for ( int col = 0; col < min( n, m - 1 ); col ++ ) {
        int l = -1;
        for ( int i = col; i < n; i ++ ) {
            if ( !isZero( a[i][col] ) ) {
                l = i;
            }
        }
        if ( l == -1 ) continue;
        for ( int j = 0; j <= m; j ++ ) {
            swap( a[l][j], a[col][j] );
        }
        l = col;
        for ( int i = 0; i < n; i ++ ) {
            if ( i != l ) {
                double ratio =  a[i][col] / a[l][col];
                for ( int j = 0; j <= m; j ++ ) {
                    a[i][j] -= ratio * a[l][j];
                }
            }
        }
    }
    for ( int i = n - 1; i >= 0; i -- ) {
        if ( isZero( a[i][i] ) ) continue;
        double rasp = a[i][m];
        for ( int j = 0; j < m; j ++ ) {
            if ( j != i ) {
                rasp -= a[i][j] * ans[j];
            }
        }
        ans[i] = rasp / a[i][i];
    }
    bool isPossible = true;

    for ( int i = 0; i < n; i ++ ) {
        double rasp = a[i][m];
        for ( int j = 0; j < m; j ++ ) {
            rasp -= a[i][j] * ans[j];
        }
        if ( !isZero( rasp ) ) isPossible = false;
    }
    if ( isPossible ) {
        fout << fixed << setprecision( 10 );
        for ( int i = 0; i < m; i ++ ) {
            fout << ans[i] << '\n';
        }
    } else {
        fout << "Imposibil\n";
    }
    return 0;   
}