Cod sursa(job #1759590)

Utilizator killer301Ioan Andrei Nicolae killer301 Data 19 septembrie 2016 16:37:27
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <cstdio>
#include <cmath>
#include <algorithm>

using namespace std;

const int NMAX = 300;
const int MMAX = 300;
const double eps = 1e-7;

double a[NMAX+1][MMAX+2], ans[MMAX+1];

int main()
{
    freopen("gauss.in", "r", stdin);
    freopen("gauss.out", "w", stdout);

    int n, m, q, f;
    scanf("%d%d", &n, &m);
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m+1; j++)
            scanf("%lf", &a[i][j]);

    for(int i=1, j=1; i<=n, j<=m; i++, j++)
    {
        int line;
        for(line=i; line<=n && fabs(a[line][j]) < eps; line++);
        if(line==n+1) j++;
        else
        {
            if(i!=line)
                for(int k=1; k<=m+1; k++)
                    swap(a[i][k], a[line][k]);

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

    bool sol = true;
    for(int i=n; i>0 && sol; i--)
    {
        for(int j=1; j<=m+1; j++)
            if(fabs(a[i][j]) >= eps)
            {
                if(j==m+1) sol = false;
                ans[j] = a[i][m+1];
                for(int l=j+1; l<=m; l++)
                    ans[j] -= ans[l]*a[i][l];
                break;
            }
    }
    if(!sol) printf("Imposibil\n");
    else
    {
        for(int i=1; i<=m; i++)
            printf("%.8lf ", ans[i]);
        printf("\n");
    }
    return 0;
}