Cod sursa(job #1161657)

Utilizator poptibiPop Tiberiu poptibi Data 31 martie 2014 13:06:01
Problema Algoritmul lui Gauss Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;

const int NMAX = 310;
const double EPS = 1e-6;

int N, M;
double A[NMAX][NMAX], Sol[NMAX];

void DoGauss()
{
    int Ec = 1, Nec = 1;
    while(Ec <= N && Nec <= M)
    {
        int i, j;
        for(i = Ec; i <= N; ++ i)
            if(fabs(A[i][Nec]) > EPS)
                break;

        if(i == N + 1)
        {
            Nec ++;
            continue;
        }

        for(int k = 1; k <= M + 1; ++ k)
            swap(A[Ec][k], A[i][k]);

        for(i = 1; i <= N; ++ i)
            if(i != Ec)
            {
                double R = A[i][Nec] / A[Ec][Nec];
                for(j = Nec; j <= M + 1; ++ j)
                    A[i][j] -= A[Ec][j] * R;
            }

       /* for(i = 1; i <= N; ++ i)
        {
            for(j = 1; j <= M + 1; ++ j)
                printf("%lf ", A[i][j]);
            printf("\n");
        }
        printf("\n");*/
        Ec ++;
        Nec ++;
    }

    for(int i = N; i; -- i)
    {
        if(fabs(A[i][i]) < EPS)
        {
            printf("Imposibil\n");
            exit(0);
        }else Sol[i] = A[i][M + 1] / A[i][i];
    }

    for(int i = 1; i <= M; ++ i) printf("%.8lf ", Sol[i]);
}

int main()
{
    freopen("gauss.in", "r", stdin);
    freopen("gauss.out", "w", stdout);

    scanf("%i %i", &N, &M);
    for(int i = 1; i <= N; ++ i)
        for(int j = 1; j <= M + 1; ++ j)
            scanf("%lf", &A[i][j]);

    DoGauss();
}