Cod sursa(job #913660)

Utilizator TeodoraTanaseTeodora Tanase TeodoraTanase Data 13 martie 2013 17:58:55
Problema Algoritmul lui Gauss Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
#include <cstdio>
#include <algorithm>

#define NMAX 301

using namespace std;

int n;
int m;
double a[NMAX][NMAX + 1];

void read()
{
    freopen("gauss.in", "r", stdin);

    scanf("%d %d\n", &n, &m);
    for(int i = 0; i < n; ++ i)
        for(int j = 0; j <= m; ++ j)
            scanf("%lf ", &a[i][j]);
}

int coefPoz(int i)
{
    for(int j = 0; j < m; ++ j)
        if(a[i][j] != 0)
            return j;

    return -1;
}

void swapRow(int r1, int r2)
{
    for(int j = 0; j < m; ++ j)
        swap(a[r1][j], a[r2][j]);
}

void modify(int r1, int r2, double val)
{
    for(int j = 0; j <= m; ++ j)
        a[r2][j] += a[r1][j] * val;
}

void triangle()
{
    for(int i = 0; i < n - 1; ++ i)
    {
        int p = coefPoz(i);

        for(int k = i + 1; k < n; ++ k)
            if(coefPoz(k) < p)
            {
                swapRow(i, k);
                break;
            }

        for(int k = i + 1; k < n; ++ k)
        {
            int q = coefPoz(k);

            if(q == p)
            {
                double val = -a[k][q] / a[i][p];

                modify(i, k, val);
            }
        }
    }
}

bool solve()
{
    for(int i = n - 1; i >= 0; -- i)
    {
        if(a[i][i] == 0)
            return 0;

        double aux = 0;

        for(int j = i + 1; j < m; ++ j)
            aux += a[i][j] * a[j][j];

        if(i < n - 1 && aux == 0)
            return 0;

        a[i][i] = (a[i][m] - aux) / a[i][i];
    }

    return 1;
}

void write()
{
    for(int i = 0; i < n; ++ i)
        printf("%lf ", a[i][i]);

    while(n < m)
    {
        printf("0 ");
        ++ n;
    }

    printf("\n");
}

int main()
{
    read();
    triangle();

    freopen("gauss.out", "w", stdout);

    if(!solve())
        printf("Imposibil\n");
    else
        write();

    return 0;
}