Cod sursa(job #1733843)

Utilizator jurjstyleJurj Andrei jurjstyle Data 25 iulie 2016 21:18:28
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.38 kb
#include <fstream>
#include <cmath>
#include <iomanip>

using namespace std;

ifstream f("gauss.in") ;
ofstream g("gauss.out") ;

int n , m ;
double a[303][303];
double x[303];
const double eps = 1e-10 ;

int main()
{

    //Citire
    f >> n >> m ;
    for ( int i = 1 ; i <= n ; ++i )
        for ( int j = 1 ; j <= m + 1 ; ++j )
            f >> a[i][j] ;

    int i = 1 , j = 1 , k ;
    double aux;

    //Algoritmul lui Gauss
    while ( i <= n && j <= m )
    {
        //Cautam o linie k pentru care A[k][j] sa fie nenul
        for ( k = i ; k <= n ; ++k )
            if( abs ( a[k][j] ) > eps )
                break ;

        //Daca nu gasim linia, necunoscuta j este variabila libera ;
        if ( k == n + 1 )
            ++j ;
        //Interschimbam pe k cu i, daca este cazul.
        if ( k != i )
            for ( int l = 1 ; l <= m + 1 ; ++l )
                swap ( a[i][l] , a[k][l] ) ;
        //impartim linia la "elementul pivot"
        for ( int l = j + 1 ; l <= m + 1 ; ++l )
            a[i][l] = a[i][l] / a[i][j];
        a[i][j] = 1 ;

        //Scadem din ecuatiile i+1...N ecuatia i inmultita cu A[u][j], pentru a face toti coeficientii de coloana j a acestor linii 0.
        for ( int u = i + 1 ; u <= n ; ++u )
            {
             for ( int l = j + 1 ; l <= m + 1 ; ++l )
                a[u][l] -= a[u][j] * a[i][l] ;
             a[u][j] = 0 ;
            }

        ++i , ++j;
    }

    //Calculul necunoscutelor
    int posibil = 1 ;
    for  ( int i = n ; i && posibil ; --i )
        for ( int j = 1 ; j <= m + 1 && posibil ; ++j )
            if( abs ( a[i][j] ) > eps )
                {
                 //Singura valoare nenegativa de pe linia i este rezultatul => sistemul nu are solutie.
                 if ( j == m + 1 )
                    {
                     g << "Imposibil" ;
                     posibil = 0 ;
                    }
                 //Calculam pe necunoscuta j = rezultatul ecuatiei i - necunoscutele j+1...M inmultite cu coeficientii lor din aceasta ecuatie.
                 x[j] = a[i][m+1];
                 for(int k = j + 1 ; k <= m ; ++k )
                     x[j] -= x[k] * a[i][k];
                 break;
                }
    if ( posibil )
        for ( int i = 1 ; i <= m ; ++i)
            g << setprecision(10) << fixed << x[i] << " " ;
    return 0;
}