Cod sursa(job #793359)

Utilizator Mihai22eMihai Ionut Enache Mihai22e Data 2 octombrie 2012 18:28:27
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include<stdio.h>
#include<fstream>

using namespace std;

#define MAXN 303
#define EPS 0.0000001

double A[ MAXN ][ MAXN ], sol [ MAXN ];
int n, m, i, j, k, q, x;
double aux;

int main()
{
    ifstream f("gauss.in");

    f >> n >> m;

    for(i = 1; i <= n; ++i)
        for(j = 1; j <= m + 1; ++j)
            f >> A[i][j];

    f.close();

    i = j = 1;

    while(i <= n && j <= m)
    {
        x = i;

        while(A[x][j] > -EPS && A[x][j] < EPS && x <= n)
            ++x;

        if(x > n)
            {
                ++j;
                continue;
            }

        if(x != i)
            for(k = 1; k <= m + 1; ++k)
                aux = A[x][k], A[x][k] = A[i][k], A[i][k] = aux;

        for(k = j + 1; k <= m + 1; ++k)
            A[i][k] = (double) A[i][k] / A[i][j];
        A[i][j] = 1;

        for(q = i + 1; q <= n; ++q)
        {
            for(k = j + 1; k <= m + 1; ++k)
                A[q][k] -= A[q][j] * A[i][k];
            A[q][j] = 0;
        }

        ++i, ++j;
    }

    k = m;
    for(i = n; i; --i)
        for(j = 1; j <= m + 1; ++j)
        if(A[i][j] < -EPS || A[i][j] > EPS)
            {
                if(j == m + 1)
                {
                     FILE *g = fopen("gauss.out", "w");

                     fprintf(g, "Imposibil\n");

                     fclose(g);

                     return 0;
                }

                sol[j] = A[i][m + 1];

                for(k = j + 1; k <= m; ++k)
                    sol[j] -= A[i][k] * sol[k];

                break;
            }
    FILE *g = fopen("gauss.out", "w");

    for(i = 1; i <= m; ++i)
        fprintf(g, "%.8lf ", sol[i]);

    fprintf(g, "\n");

    fclose(g);

    return 0;

}