Cod sursa(job #717523)

Utilizator Addy.Adrian Draghici Addy. Data 19 martie 2012 23:14:07
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <cstdio>
#include <algorithm>

using namespace std;

#define MAX 305
#define EPS	0.0000001

int N, M;
double A[MAX][MAX], X[MAX];

bool zero (double), gauss ();
void swap_lines (int, int), input (), output ();

int main () {
	
	input ();
	
	output ();
	
}

bool gauss () {
	
	int i, j, k, t, p;
	
	for (i = 1, j = 1; i <= N && j <= M; j++) {
		
		for (k = i; k <= N; k++)
			if (!zero (A[k][j])) break;
		
		if (k == N + 1) continue;
		
		if (i != k) swap_lines (i, k);
		
		for (t = j + 1; t <= M + 1; t++) A[i][t] /= A[i][j];
		A[i][j] = 1;
		
		for (t = i + 1; t <= N; t++) {
			for (p = j + 1; p <= M + 1; p++)
				A[t][p] -= A[t][j] * A[i][p];
			A[t][j] = 0;
		}
		
		i++;
	}
	
	for (i = N; i > 0; i--)
		for (j = 1; j <= M + 1; j++)
			if (!zero (A[i][j])) {
				
				if (j == M + 1) return 0;
				
				X[j] = A[i][M + 1];
				for (k = j + 1; k <= M; k++)
					X[j] -= X[k] * A[i][k];
				
				break;
			}
	
	return 1;
}

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

bool zero (double x) {
	
	if (x < 0) x = -x;
	
	if (x < EPS) return 1;
	return 0;
}

void input () {
	
	freopen ("gauss.in", "r", stdin);
	
	scanf ("%d %d", &N, &M);
	
	int i, j;
	for (i = 1; i <= N; i++)
		for (j = 1; j <= M + 1; j++)
			scanf ("%lf", &A[i][j]);
}

void output () {
	
	freopen ("gauss.out", "w", stdout);
	
	if (gauss ()) {
		for (int i = 1; i <= M; i++)
			printf ("%.8lf ", X[i]);
		printf ("\n");
	}
	else printf ("Imposibil\n");
}