Cod sursa(job #1959749)

Utilizator antanaAntonia Boca antana Data 9 aprilie 2017 21:12:14
Problema Algoritmul lui Gauss Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <bits/stdc++.h>

#define MAXN 302

using namespace std;

int n, m;
double gauss[MAXN][MAXN], answer[MAXN];

inline void divide(int row, double cf) {
    for(int j = 1; j <= m+1; ++j)
        gauss[row][j] /= cf;
}

inline void substract(int row1, int row2, double cf) {
    for(int j = 1; j <= m+1; ++j)
        gauss[row1][j] = gauss[row1][j] - gauss[row2][j] * cf;
}

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

    int i, j, k;

    scanf("%d%d", &n, &m);

    for(i=1; i<=n; ++i)
        for(j=1; j<=m+1; ++j)
            scanf("%lf", &gauss[i][j]);

    i = j = 1;
    while(i <= n && j <= m) {
        if(gauss[i][j] == 0) {
            k = i + 1;
            while(k <= n && !gauss[i][j])
                k++;
            if(k > n) {
                j++;
                continue;
            }

            swap(gauss[i], gauss[k]);
        }

        divide(i, gauss[i][j]);
        for(k = i+1; k<=n; ++k)
            if(gauss[k][j])
                substract(k, i, gauss[k][j]);

        i++; j++;
    }

    for(i=n; i>0; --i)
        for(j=1; j<=m+1; ++j)
            if(gauss[i][j] != 0) {
                if(j == m + 1) {
                    printf("Imposibil\n");
                    return 0;
                }

                answer[j] = gauss[i][m+1];
                for(k=j+1; k<=m; ++k)
                    answer[j] -= answer[k] * gauss[i][k];

                break;
            }

    for(i=1; i<=m; ++i)
        printf("%.10lf ", answer[i]);


    return 0;
}