Cod sursa(job #650605)

Utilizator Bit_MasterAlexandru-Iancu Caragicu Bit_Master Data 18 decembrie 2011 15:31:51
Problema Algoritmul lui Gauss Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.13 kb
/*
    Pt fiecare coloana i las elem de pe linia i nevid si adun si scad linia i la celelalte linii pt a face 0 restul elem
de pe coloana j. Coloanele precedente nu se strica deoarece elem lor de pe linia de lucru i este 0.
*/

#include <cstdio>
#include <cmath>

const int N = 305;
const int M = 305;
const double EPS = 1e-7;

int n, m;
double a[N][M];
double x[M]; //solutii
int p;

void citire()
{
    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_linie(int i1, int i2)
{
    double aux;
    for (int j = 1; j <= m+1; ++j)
    {
        aux = a[i1][j];
        a[i1][j] = a[i2][j];
        a[i2][j] = aux;
    }
}

void aduna_linie(int i1, int i2, double k)
{
    for (int j = 1; j <= m+1; ++j)
        a[i1][j] += k * a[i2][j];
}

void gauss()
{
    p = 1;//elem de pe coloana curenta care il consider nevid.
    for (int j = 1; j <= m; ++j)
    {
        if (fabs(a[p][j]) < EPS)
        {
            int i;
            for (i = p+1; i <= n;++i)
                if (fabs(a[i][j]) > 0)
                {
                    interschimba_linie(p,i);
                    break;
                }
            if (i > n)
                continue;
        }
        for (int i = 1; i <= n; ++i)
        {
            if (i == p)
                continue;
            aduna_linie(i,p,-a[i][j]/a[p][j]);
        }
        ++p;
    }
}

void calculare_solutii()
{
    for (int i = p; i <= n; ++i)
    {
        int j;
        for (j = 1; j <= m; ++j)   //verificare linii goale
            if (fabs(a[i][j]) > EPS)
                break;
        if (j > m && fabs(a[i][m+1]) > EPS)
        {
            printf("imposibil");
            return;
        }
    }

    for (int i = 1; i <= p-1; ++i)
        for (int j = 1; j <= m; ++j)
            if (fabs(a[i][j]) > EPS)
            {
                x[j] = a[i][m+1]/a[i][j];
                break;
            }

    for (int j = 1; j <= m; ++j)
        printf("%lf ",x[j]);
}

int main()
{
    freopen("gauss.in","r",stdin);
    freopen("gauss.out","w",stdout);
    citire();
    gauss();
    calculare_solutii();
    return 0;
}