Cod sursa(job #995751)

Utilizator poptibiPop Tiberiu poptibi Data 10 septembrie 2013 11:11:07
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.93 kb
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;

const double EPS = 1e-10;
const int Nmax = 310;

int N, M;
double A[Nmax][Nmax], X[Nmax];

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]);

    int Ec = 1, Nec = 1, L;

    while(Ec <= N && Nec <= M)
    {
        for(L = Ec; L <= N; ++ L)
            if(A[L][Nec] < -EPS || A[L][Nec] > EPS)
                break;

        if(L == N + 1)
        {
            Nec ++;
            break;
        }

        if(L != Ec)
            for(int NowNec = 1; NowNec <= M + 1; NowNec ++)
            {
                double Temp = A[Ec][NowNec];
                A[Ec][NowNec] = A[L][NowNec];
                A[L][NowNec] = Temp;
            }

        for(int NowNec = Nec + 1; NowNec <= M + 1; NowNec ++)
            A[Ec][NowNec] /= A[Ec][Nec];
        A[Ec][Nec] = 1;

        for(int NowEc = Ec + 1; NowEc <= N; ++ NowEc)
        {
            for(int NowNec = Nec + 1; NowNec <= M + 1; ++ NowNec)
                A[NowEc][NowNec] -= A[NowEc][Nec] * A[Ec][NowNec];
            A[NowEc][Nec] = 0;
        }

        Ec ++;
        Nec ++;
    }

    for(int Ec = N; Ec > 0; Ec --)
        for(int Nec = 1; Nec <= M + 1; ++ Nec)
            if(A[Ec][Nec] < -EPS || A[Ec][Nec] > EPS)
            {
                if(Nec == M + 1)
                {
                    printf("Imposibil\n");
                    return 0;
                }

                X[Nec] = A[Ec][M + 1];
                for(int NowNec = Nec + 1; NowNec <= M; ++ NowNec)
                    X[Nec] -= X[NowNec] * A[Ec][NowNec];

                break;
            }

    for(int i = 1; i <= M; ++ i)
        printf("%.10f ", X[i]);

    return 0;
}