Cod sursa(job #1980318)

Utilizator Dan_RadulescuRadulescu Dan Dan_Radulescu Data 12 mai 2017 20:42:43
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.32 kb
#include<stdio.h>
#include<math.h>
#define APROX 0.0000001
using namespace std;
FILE *f1 = fopen("gauss.in", "r");
FILE *f2 = fopen("gauss.out", "w");

int N, M, i, j, k, last;
long double a[301][302], aux, sol[302], sum = 0;

void gauss(long double a[][302], int N, int M)
{
    long double aux, maxs, val;
    int i , j, k, l, c;
    for (k = 1; k <= N; k++)
    {
            maxs = fabs(a[k][k]);
            if (k > M)
                break;
            l = k;
            c = k;
            for (i = k; i <= N; i++)
                    if (fabs(a[i][k] - maxs) > APROX)
                    {
                        maxs = fabs(a[i][k]);
                        l = i;
                        c = k;
                    }
            if (k != l)
                for (i = k; i <= M + 1; i++)
                {
                    aux = a[l][i];
                    a[l][i] = a[k][i];
                    a[k][i] = aux;
                }

            for (j = k + 1; j <= M+1; j++)
                a[k][j] = a[k][j] / a[k][k];
            a[k][k] = 1;

            for (i = k+1; i <= N; i++)
            {
                val = a[i][k];
                for (j = k; j <= M+1; j++)
                    a[i][j] = a[i][j] - a[k][j] * val;
            }
    }
}

int main()
{

    fscanf(f1, "%d%d", &N, &M);
    for (i = 1; i <= N; i++)
        for (j = 1; j <= M+1; j++)
            fscanf(f1, "%Lf", &a[i][j]);
    gauss(a, N, M);
    /*for (i = 1; i <= N; i++)
    {
        for (j = 1; j <= M + 1; j++)
            printf("%Lf ", a[i][j]);
        printf("\n");
    }*/

    for (i = N; i >= 1; i--)
    {
        if (fabs(a[i][M] - 0) <= APROX && fabs(a[i][M+1] - 0) > APROX)
        {
            fprintf(f2, "Imposibil\n");
            fclose(f1);
            fclose(f2);
            return 0;
        }
        if (fabs(a[i][M] - 0) > APROX)
        {
            for (j = M - 1; j >= 1; j--)
                if (fabs(a[i][j] - 0) > APROX)
                    sol[j] = 0;
                else
                    break;
            sol[M] = a[i][M+1]  / a[i][M];
            break;
        }
    }
    last = j;
    for (i = last; i >= 1; i--)
    {
        sum = 0;
        for (j = i + 1; j <= M; j++)
            sum = sum + a[i][j] * sol[j];
        sol[i] = a[i][M+1] - sum;
    }
    for (i = 1; i <= M; i++)
        fprintf(f2, "%.10Lf ", sol[i]);
    return 0;
}