Cod sursa(job #2087016)

Utilizator circeanubogdanCirceanu Bogdan circeanubogdan Data 12 decembrie 2017 19:50:22
Problema Algoritmul lui Gauss Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <fstream>
#include <iomanip>
#define EPS 1e-10
#define DIM 303

using namespace std;

ifstream f("gauss.in");
ofstream g("gauss.out");

int n, m;

double sol[DIM], a[DIM][DIM];

int main()
{
    f>>n>>m;
    for(int i = 1; i <= n; ++ i)
        for(int j = 1; j <= m + 1; ++ j)
            f>>a[i][j];

    int i = 1, j = 1;
    while(i <= n && j <= m){
        int ic = i;
        while(ic <= n){
            if(a[ic][j])
                break;
            ++ ic;
        }
        if(ic == n + 1){
            ++ j;
            continue;
        }
        if(ic != i)
            for(int jc = j; jc <= m + 1; ++ jc)
                swap(a[i][jc], a[ic][jc]);

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

        a[i][j] = 1;
        for(int ic = i + 1; ic <= n; ++ ic){
            if(a[ic][j] == 0)
                continue;
            for(int jc = j + 1; jc <= m + 1; ++ jc){
                a[ic][jc] -= a[ic][j] * a[i][jc];
            }
            a[ic][j] = 0;
        }
        ++ i;
        ++ j;
    }

    i = n, j = m;
    while(i >= 1){
        int jc = 1;
        while(jc <= m + 1){
            if(a[i][jc] < -EPS || a[i][jc] > EPS)
                break;
            ++ jc;
        }
        if(jc == m + 1){
            g<<"Imposibil";
            return 0;
        }
        if(jc == m + 2){
            -- i;
            continue;
        }
        double s = 0;
        for(int jn = jc + 1; jn <= m; ++ jn)
            s += a[i][jn] * sol[jn];
        sol[jc] = (a[i][m + 1] - s);
        -- i;
    }
    for(int i = 1; i <= n; ++ i)
        g<<fixed<<setprecision(10)<<sol[i]<<" ";

    return 0;
}