Cod sursa(job #1162870)

Utilizator romircea2010FMI Trifan Mircea Mihai romircea2010 Data 1 aprilie 2014 00:22:26
Problema Algoritmul lui Gauss Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 2.38 kb
#include <cstdio>
#include <cmath>
#include <algorithm>

using namespace std;

const int NMax = 310, MMax = 310;
const double EPS = 1e-9;

int N, M;
long double sol[NMax], coef[NMax][MMax];

void Read()
{
    FILE *f = fopen("gauss.in", "r");
    fscanf(f, "%d %d", &N, &M);
    for (int i = 1; i <= N; ++ i)
        for (int j = 1; j <= M + 1; ++ j)
        {
            double x;
            fscanf(f, "%lf", &x);
            coef[i][j] = x;
        }
    fclose(f);
}

void Solve()
{
    int nr_ec, nr_nec;
    nr_ec = 1, nr_nec = 1;
    while (nr_ec <= N && nr_nec <= M)
    {
        int i, j;
        if (fabs(coef[nr_ec][nr_nec]) < EPS) /// daca am coeficientu 0
        {
            for (i = nr_ec + 1; i <= N; ++ i) /// caut o ecuatie care nu are coeficientu 0
                if (fabs(coef[i][nr_nec]) > EPS)
                    break;
            if (i == N + 1) /// daca nu am gasit asa ecuatie atunci ++nr_nec, trec la urmatoarea coloana
            {
                ++ nr_nec;
                continue;
            }
            else
                for (int k = 1; k <= M + 1; ++ k) /// daca am gasit le interschimb si continui algoritmu
                    swap(coef[i][k], coef[nr_ec][k]);
        }
        for(i = 1; i <= N; ++ i)
        {
            if (i == nr_ec)
                continue;
            /// cream raport = coeficientu de la ecuatia i (aia la care vreau sa fac zerouri) / coeficientu la ecualtia nr_ec (asta curenta)
            /// apoi din ecuatia i scadem raport * ecuatia nr_ec si o sa facem 0 pe linia i coloana nr_nec
            double raport = coef[i][nr_nec] / coef[nr_ec][nr_nec];
            for (j = 1; j <= M + 1; ++ j)
                coef[i][j] -= coef[nr_ec][j] * raport;
        }
        ++ nr_ec, ++ nr_nec;
    }
    FILE *g = fopen("gauss.out", "w");
    for (int i = 1; i <= N; ++ i)
    {
        int j;
        for(j = 1; j <= M + 1; ++ j)
            if (fabs(coef[i][j]) > EPS)
                break;
        if (j == M + 1)
        {
            fprintf(g, "Imposibil\n");
            fclose(g);
            return ;
        }
        sol[i] = coef[i][M + 1] / coef[i][i];
    }
    for (int i = 1; i <= M; ++ i)
    {
        double x = sol[i];
        fprintf(g, "%.10lf ", x);
    }
    fprintf(g, "\n");
    fclose(g);
}

int main()
{
    Read();
    Solve();
    return 0;
}