Cod sursa(job #1450263)

Utilizator HotSteelBeteag Ion Andrei HotSteel Data 12 iunie 2015 11:05:57
Problema Algoritmul lui Gauss Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.71 kb
#include <stdio.h>

#define eps 1e-10

double A[305][305];
double X[305];

int main()
{
    FILE* fin = fopen("gauss.in", "r");
    FILE* fout= fopen("gauss.out", "w");

    int N, M;
    fscanf(fin, "%d%d", &N, &M);

    int i, j, k, l, u;
    for(i = 1 ; i <= N ; ++i)
        for(j = 1 ; j <= M + 1 ; ++j)
            fscanf(fin, "%lf", &A[i][j]);

    double aux;

    i = j = 1;

    while(i <= N && j <= M)
    {
        for(k = i ; k <= N ; ++k)
            if(A[k][j] < -eps || A[k][j] > eps)
                break;

        if(k == N + 1)
        {
            ++j;
            continue;
        }

        if(k != i)
            for(l = 1 ; l <= M + 1 ; ++l)
            {
                aux = A[i][l];
                A[i][l] = A[k][l];
                A[k][l] = aux;
            }

        for(l = j + 1 ; l <= M + 1 ; ++l)
            A[i][l] = A[i][l] / A[i][j];
        A[i][j] = 1;

        for(u = i + 1 ; u <= N ; ++u)
        {
            for(l = j + 1 ; l <= M + 1 ; ++l)
                A[u][l] -= A[u][j] * A[i][l];

            A[u][j] = 0;
        }

        ++i;
        ++j;
    }

    for(i = N ; i > 0 ; --i)
        for(j = 1 ; j <= M + 1 ; ++j)
            if(A[i][j] < -eps || A[i][j] > eps)
            {
                if(j == M + 1)
                {
                    fprintf(fout, "Imposibil\n");

                    return 0;
                }

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

                break;
            }

    for(i = 1 ; i <= M ; ++i)
        fprintf(fout, "%.8lf ", X[i]);

    fprintf(fout, "\n");

    return 0;
}