Cod sursa(job #2182405)

Utilizator KemyKoTeo Virghi KemyKo Data 22 martie 2018 12:46:57
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <cstdio>
#include <fstream>
#include <cmath>
#include <iomanip>
#define NMAX 303
#define ld long double
#define E 0.000000001

using namespace std;

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

int n, m, k;
double M[NMAX][NMAX];
double rez[NMAX];

void change(int a, int b, int c)
{
    for (int i=c; i<=m+1; ++i)
        swap(M[a][i], M[b][i]);
}

void divide(int a, ld b, int c)
{
    for (int i=c; i<=m+1; ++i)
        M[a][i] /= b;
}

void sub(int a, int b, ld c, int d)
{
    for (int i=d; i<=m+1; ++i)
        M[a][i] -= M[b][i] * c;
}

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

    k = 1;
    for (int j=1; j<=m; ++j) {
        if (abs(M[k][j]) < E)
            for (int i=k; i<=n; ++i)
                if (abs(M[i][j]) > E) {
                    change(i, k, j);
                    break;
                }

        if (abs(M[k][j]) < E) continue;

        divide(k, M[k][j], j);

        for (int i=k+1; i<=n; ++i)
            sub(i, k, M[i][j], j);

        ++k;
    }

    for (int i=n; i>=1; i--) {
        int sav = -1;

        for (int j=1; j<=m; ++j) {
            if (abs(M[i][j]) > E) {
                sav = j;
                break;
            }
        }

        if (sav==-1 && abs(M[i][m+1]) > E) {
            g<<"Imposibil\n";
            return 0;
        }

        for (int j=sav+1; j<=m; ++j)
            M[i][m+1] -= rez[j] * M[i][j];
        rez[sav] = M[i][m+1];
    }

    for (int i=1; i<=m; ++i)
        g<<fixed<<setprecision(10)<<rez[i]<<' ';

    return 0;
}