Cod sursa(job #2829607)

Utilizator andrei_marciucMarciuc Andrei andrei_marciuc Data 8 ianuarie 2022 19:48:55
Problema Algoritmul lui Gauss Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.68 kb
#include <cstdio>
#define MAX 301
#define E 0.001

double a[ MAX + 1 ][ MAX + 1 ];
double v[ MAX + 1 ], y;
int n, m;

int main ()
{
    int i, j;
    FILE *fin = fopen( "gauss.in", "r" );
    fscanf( fin, "%d%d", &n, &m );
    for( i = 1; i <= n; ++i )
        for( j = 1; j <= m + 1; ++j )
            fscanf( fin, "%lf", &a[ i ][ j ] );
    fclose( fin );

    for( j = 1; j <= m; ++j ) {
        for( i = j; i <= n; ++i )
            if( a[ i ][ j ] > E || a[ i ][ j ] < -E )
                break;
            if( i <= n ) {
                if( i != j )
                    for( int k = 1; k <= m + 1; ++k ) {
                        y = a[ i ][ k ];
                        a[ i ][ k ] = a[ j ][ k ];
                        a[ j ][ k ] = y;
                    }
                for( int k = j + 1; k <= m + 1; ++k )
                    a[ j ][ k ] /= a[ j ][ j ];
                
                a[ j ][ j ] = 1;
                for( int k = j + 1; k <= n; a[ k ][ j ] = 0, ++k )
                    for( int l = j + 1; l <= m + 1; ++l )
                        a[ k ][ l ] -= a[ j ][ l ] * a[ k ][ j ];
            }
    }

    FILE *fout = fopen( "gauss.out", "w" );
    for( i = n; i > 0; --i )
        for( j = 1; j <= m + 1; ++j )
            if( a[ i ][ j ] > E || a[ i ][ j ] < -E ) {
                if( j == m + 1 ) {
                    fprintf( fout, "Imposibil" );
                    return 0;
                }

                v[ j ] = a[ i ][ m + 1 ];
                for( int k = j + 1; k <= m; ++k )
                    v[ j ] -= v[ k ] * a[ i ][ k ];
                break;
            }
    for( i = 1; i <= m; ++i )
        fprintf( fout, "%.9lf ", v[ i ] );
    fclose( fout );
    return 0;
}