Cod sursa(job #1678450)

Utilizator BugirosRobert Bugiros Data 7 aprilie 2016 12:31:48
Problema Algoritmul lui Gauss Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.89 kb
#include <cstdio>
#include <iomanip>
using namespace std;

const int MAXN = 303;
const double EPS = 0.0000001;

double a[MAXN][MAXN];
double x[MAXN];

int n,m;

void citire()
{
    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]);
}

void interschimba(double &a, double &b)
{
    double aux = a;
    a = b;
    b = aux;
}

void gauss()
{
    int i = 1,j = 1,k;
    while(i <= n && j <= m)
    {
        for (k = i;k <= n;++k)
            if (!(-EPS < a[k][j] && a[k][j] < EPS))
                break;
        if (k == n + 1)
        {
            ++j;
            continue;
        }

        if (k != i)
            for (int jj = 1;jj <= m + 1;++jj)
                interschimba(a[i][jj], a[k][jj]);
        for (int jj = j + 1;jj <= m + 1;++jj)
            a[i][jj] /= a[i][j];
        a[i][j] = 1;

        for (int ii = i + 1;ii <= n;++ii)
        {
            for (int jj = j + 1;jj <= m + 1;++jj)
                a[ii][jj] -= a[ii][j] * a[i][jj];
            a[ii][j] = 0;
        }
        ++i;
        ++j;
    }
}

bool calculare_necunoscute()
{
    for (int i = n;i >= 1;--i)
        for (int j = 1;j <= m + 1;++j)
            if(!(-EPS < a[i][j] && a[i][j] < EPS))
            {
                if (j == m + 1)
                    return false;
                x[j] = a[i][m + 1];
                for (int k = j + 1;k <= m;++k)
                    x[j] -= a[i][k] * x[k];

                break;
            }
    return true;
}

int main()
{
    citire();
    gauss();
    bool ok = calculare_necunoscute();
    if (!ok)
        printf("Imposibil\n");
    else
    {
        for (int i = 1;i <= n;++i)
            printf("%.8lf ",x[i]);
        printf("\n");
    }
    return 0;
}