Cod sursa(job #1338405)

Utilizator iordache.bogdanIordache Ioan-Bogdan iordache.bogdan Data 9 februarie 2015 23:40:08
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
#include <algorithm>
#include <iomanip>
#define DIM 305
#define EPS 0.0000001
#define ERROR_MESSAGE "Imposibil"
#define infile "gauss.in"
#define outfile "gauss.out"

using namespace std;

ifstream f(infile);
ofstream g(outfile);

double a[DIM][DIM];

double ans[DIM];

int main() {

	int n, m;

	f >> n >> m;

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

	for (int i = 1, j = 1; i <= n && j <= m; ++i, ++j) {

		for (int k = i; k <= n; ++k) {

			if (a[k][j] < -EPS || a[k][j] > EPS) {

				for (int l = 1; l <= m + 1; ++l)
					swap(a[k][l], a[i][l]);

				break;

			}

		}

		if (a[i][j] > -EPS && a[i][j] < EPS) {

			--i;
			continue;

		}

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

		a[i][j] = 1;

		for (int k = i + 1; k <= n; ++k) {

			for (int l = j + 1; l <= m + 1; ++l)
				a[k][l] -= a[k][j] * a[i][l];

			a[k][j] = 0;
		}

	}

	for (int i = n; i; --i) {

		for (int j = 1; j <= m + 1; ++j) {

			if (a[i][j] > EPS || a[i][j] < -EPS) {

				if (j == m + 1) {

					g << ERROR_MESSAGE;
					return 0;

				}

				ans[j] = a[i][m + 1];

				for (int l = j + 1; l <= m; ++l)
					ans[j] -= ans[l] * a[i][l];

				break;

			}

		}

	}

	g << setprecision(8) << fixed;

	for (int i = 1; i <= m; ++i)
		g << ans[i] << ' ';

	return 0;
}

//Trust me, I'm the Doctor!