Cod sursa(job #1127252)

Utilizator PatrikStepan Patrik Patrik Data 27 februarie 2014 11:47:15
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.97 kb
    #include<cstdio>
    using namespace std;
    #define MAX 305
    #define zr 0.0000001
    int N , M ;
    double A[MAX][MAX]  , X[MAX];

    void read();
    bool solve();
    void write();

    int main()
    {
        read();
        if(solve())
            write();
        else printf("Imposibil");
        return 0;
    }

    void read()
    {
        freopen("gauss.in" , "r" , stdin );
        freopen("gauss.out" , "w" , stdout );
        scanf("%d%d" , &N , &M );
        for(int i = 1 ; i <= N ; ++i )
            for(int j = 1 ; j<= M+1 ; j++ )
            scanf("%lf" , &A[i][j]);
    }

    bool solve()
    {
        int i , j , p,k;
        double aux;
        i = j = 1;
        while(i <= N && j<= M)
        {
            for(p = i ; p <= N ; ++p )
                if(A[p][j] < zr || A[p][j] > zr)
                break;
            if(p == N+1)
            {
                j++;
                continue;
            }
            if( p != i)
                for( k = j ; k <= M ; ++k )
            {
                aux = A[i][j];
                A[i][j] = A[p][j];
                A[p][j] = aux;
            }
            for( k = j+1 ; k<= M+1 ; ++k )
                A[i][k] /=A[i][j];
            A[i][j] = 1;
            for( p = i+1 ; p <= N ; ++p)
            {
                for(k = j+1 ; k <= M+1 ; ++k )
                 A[p][k] -= A[p][j]*A[i][k];
                 A[p][j] = 0;
            }
            i++;j++;
        }
        for(i = N ; i ; i--)
        {
            for(j = 1 ; j <= M ; ++j )
                if(A[i][j] < -zr || A[i][j] > zr)
                break;
            if(j == M+1 && (A[i][M+1] < -zr || A[i][M+1] > zr ))return 0;
            X[j] = A[i][M+1];
            for(k = j+1 ; k <= M ; ++k )
                X[j] -= A[i][k]*X[k];
        }
        return 1;
    }

    void write()
    {
        for(int i = 1 ; i<= M ; ++i )
            printf("%.10lf " , X[i]);
    }