Cod sursa(job #1846983)

Utilizator tudor_bonifateTudor Bonifate tudor_bonifate Data 14 ianuarie 2017 11:00:03
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <cstdio>
using namespace std;
#define epsilon 1e-7
int n, m,i,j,l,u,k;
const int MAX=310;
double a[MAX][MAX];
double X[MAX];
double aux;
int main()
{
    freopen("gauss.in", "r", stdin);
    freopen("gauss.out", "w", stdout);
    scanf("%d%d", &n, &m);
    for (i=1; i<=n; ++i) for (j=1; j<=m+1; ++j) scanf("%lf", &a[i][j]);
    i=1;
    j=1;
    while(i<=n && j<=m)
    {
        for (k=i; k<=n; ++k) if(a[k][j]<-epsilon || a[k][j]>epsilon)
                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]>epsilon || a[i][j]<-epsilon)
            {
                if(j == m+1)
                {
                    printf("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) printf("%.8lf ", X[i]);
    printf("\n");
    return 0;
}