Cod sursa(job #1385563)

Utilizator CiurezAndreiCiurez Marius-Andrei CiurezAndrei Data 12 martie 2015 07:55:43
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
#include <fstream>
#include <iomanip>
#define DIM 305
#define EPS 0.000000001

using namespace std;

int n, m, i, j, k, p, solution;
double A[DIM][DIM], A2[DIM];


int main()
{
    ifstream fin("gauss.in");
    ofstream fout("gauss.out");

    fin >> n >> m;

    for(i = 1; i <= n; i ++)
        for(j = 1; j <= m + 1; j ++)
            fin >> A[i][j];

    i = 1;
    j = 1;

    while(i <= n && j <= m)
    {
        for(k = i; k <= n; k ++)
        {
            if(A[k][j] != 0)
                break;
        }
        if(k == n + 1)
        {
            j ++;
            continue;
        }
        if(k != i)
        {
            for(p = 1; p <= m + 1; p ++)
            {
                swap(A[i][p], A[k][p]);
            }
        }
        for (p = j + 1; p <= m + 1; p++)
        {
            A[i][p]/=A[i][j];
        }
        A[i][j] = 1;

        for(k = i + 1; k <= n; k ++)
        {
            for(p = j + 1; p <= m + 1; p ++)
            {
                A[k][p] -= A[i][p]*A[k][j];
            }
            A[k][j] = 0;
        }
        i ++;
        j ++;
    }

    for(i = n; i >= 1; i --)
    {
        for(j = 1; j <= m + 1; j ++)
        {
            if (A[i][j] < -EPS || A[i][j] > EPS)
                break;
        }
        if(j == m + 2)
        {
            continue;
        }
        if(j == m + 1)
        {
            solution = -1;
            break;
        }
        A2[j] = A[i][m + 1];

        for(k = j + 1; k <= m; k ++)
        {
            A2[j] -= A2[k] * A[i][k];
        }
    }

    if(solution == - 1)
        fout << "Imposibil" << "\n";
    else
    {
        for (i = 1;i <= m;i ++)
            fout << setprecision(10) << fixed << A2[i] << " ";
    }



    return 0;
}