Cod sursa(job #794181)

Utilizator vlad96Vlad Zuga vlad96 Data 5 octombrie 2012 21:07:58
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include <iostream>
#include <stdio.h>

using namespace std;

#define MAXN 310
#define EPS 0.0000001

int n, m, i, j, k;
double a[MAXN][MAXN], x[MAXN], aux;

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

    fscanf(fis, "%d %d", &n, &m);
    for ( i = 1; i <= n; i ++ )
        for ( j = 1; j <= m+1; j ++ )
            fscanf(fis, "%lf", &a[i][j]);

    i = 1, 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 ( int l = 1; l <= m+1; l ++ )
            {
                aux = a[i][l];
                a[i][l] = a[k][l];
                a[k][l] = aux;
            }

        for ( int l = j+1; l <= m+1; l++ )
            a[i][l] = a[i][l] / a[i][j];
        a[i][j] = 1;

        for ( int u = i+1; u <= n; u ++ )
        {
            for ( int 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(fis2, "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(fis2, "%.8lf ", x[i]);
    fprintf(fis2, "\n");

    fclose(fis);
    fclose(fis2);

    return 0;
}