Cod sursa(job #1265751)

Utilizator diana97Diana Ghinea diana97 Data 17 noiembrie 2014 18:34:00
Problema Algoritmul lui Gauss Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <iostream>
#include <fstream>
#include <iomanip>

using namespace std;

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

const int NMAX = 300 + 1;

int n, m;
double x[NMAX];
double a[NMAX][NMAX];

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

void rezolva() {
    int i, j, k;
    i = 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 (int l = 1; l <= m + 1; l++) swap(a[i][l], a[k][l]);
        for (int l = j + 1; l <= m + 1; l++) a[i][l] /= a[i][j];
        a[i][j] = 1;
        for (int u = i + 1; u <= n; u++) {
            for (int l = j + 1; l <= m + 1; l++)
                a[u][l] -= a[u][j] * a[i][l];
            a[u][j] = 0;
        }
        i++; j++;
    }
}

void calculeaza_necunoscute() {

    for (int i = n; i > 0; i--)
        for (int j = 1; j <= m + 1; j++)
            if (a[i][j] != 0) {
                if (j == m + 1) {g << "Imposibil\n"; return;}
                x[j] = a[i][m + 1];
                for (int k = j + 1; k <= m; k++) x[j] -= x[k] * a[i][k];
                break;
            }

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

int main() {
    citeste();
    rezolva();
    calculeaza_necunoscute();
    return 0;
}