Cod sursa(job #1904344)

Utilizator zdavid112zIon David-Gabriel zdavid112z Data 5 martie 2017 14:40:48
Problema Algoritmul lui Gauss Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.34 kb
#include <cstdio>
#define eps 1e-8

using namespace std;

int n, m;
double mat[301][301];
double rez[301];

inline bool ezero(const double& d)
{
    return d >= -eps && d <= eps;
}

int main()
{
    freopen("gauss.in", "r", stdin);
    freopen("gauss.out", "w", stdout);
    scanf("%d%d", &n, &m);
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j <= m; j++)
        {
            scanf("%lf", &mat[i][j]);
        }
    }
    int lc = 0, cc = 0;
    while(lc < n)
    {
        if(ezero(mat[lc][cc]))
        {
            int i;
            for(i = cc + 1; i < m; i++)
            {
                if(!ezero(mat[lc][i])) break;
            }
            if(i < m)
            {
                for(int j = 0; j <= m; j++)
                {
                    mat[j][cc] += mat[j][i];
                }
            }
            else if(!ezero(mat[lc][i]))
            {
                printf("Imposibil");
                return 0;
            }
            else
            {
                lc++;
                continue;
            }
        }
        for(int i = cc + 1; i <= m; i++)
            mat[lc][i] /= mat[lc][cc];
        mat[lc][cc] = 1;
        for(int i = lc + 1; i < n; i++)
        {
            if(ezero(mat[i][cc]))
                continue;
            for(int j = cc + 1; j <= m; j++)
            {
                mat[i][j] /= mat[i][cc];
                mat[i][j] -= mat[lc][j];
            }
            mat[i][cc] = 0;
        }
        lc++; cc++;
    }
    if(cc != m)
    {
        printf("Imposibil");
        return 0;
    }
    for(int i = n - 1; i >= 0; i--)
    {
        int j;
        for(j = 0; j < m; j++)
        {
            if(!ezero(mat[i][j])) break;
        }
        if(j == m && ezero(mat[i][j])) continue;
        else if(j == m)
        {
            printf("Imposibil");
            return 0;
        }
        double st = 0;
        for(int k = j + 1; k < m; k++)
        {
            st += rez[k] * mat[i][k];
        }
        rez[j] = mat[i][m] - st;
    }
    for(int i = 0; i < m; i++)
        printf("%lf ", rez[i]);
    return 0;
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j <= m; j++)
        {
            printf("%lf ", mat[i][j]);
        }
        printf("\n");
    }
    return 0;
}