Cod sursa(job #650480)

Utilizator nandoLicker Nandor nando Data 18 decembrie 2011 11:24:38
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <cstdio>
#include <cmath>
#include <iostream>
using namespace std;

#define MAXN 330
#define EPS 1e-7
int n, m;
double a[MAXN][MAXN], x[MAXN];

int main()
{
	FILE* fin = fopen("gauss.in", "r");
	FILE* fout = fopen("gauss.out", "w");

	fscanf(fin, "%d %d\n", &n, &m);

	for (int i = 1; i <= n; ++i) {
		for (int j = 1; j <= m + 1; ++j) {
			fscanf (fin, "%lf", &a[i][j]);
		}
	}

	for (int i = 1, j = 1, k; i <= n && j <= m; ++j) {
		for (k = i; k <= n; ++k) {
			if (a[k][j] < -EPS || EPS < a[k][j]) {
				break;
			}
		}

		if (k == n + 1) {
			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];
		}

		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.0;
		}

		++i;
	}
	

	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) {
					fprintf(fout, "Imposibil!\n");
					return 0;
				}

				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) {
		fprintf (fout, "%.8lf ", x[i]);
	}
	fprintf (fout, "\n");

	fclose(fin);
	fclose(fout);
	return 0;
}