Cod sursa(job #1165932)

Utilizator poptibiPop Tiberiu poptibi Data 3 aprilie 2014 01:02:52
Problema Algoritmul lui Gauss Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;

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

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

void DoGauss()
{
    int Ec = 1, Nec = 1;
    while(Ec <= N && Nec <= M)
    {
        int i;
        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[i][k], A[Ec][k]);

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

        Ec ++;
        Nec ++;
    }

    for(int i = 1; i <= N; ++ i)
    {
        int j;
        for(j = 1; j <= M + 1; ++ j)
            if(fabs(A[i][j]) > EPS)
                break;

        if(j == M + 1)
        {
            printf("Imposibil\n");
            exit(0);
        }

        Sol[i] = A[i][M + 1] / A[i][i];
    }

    for(int i = 1; i <= M; ++ i) printf("%.6lf ", 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();
}