Cod sursa(job #669184)

Utilizator cosmyoPaunel Cosmin cosmyo Data 26 ianuarie 2012 12:46:15
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <cstdio>
using namespace std;
const int N = 305;
const double EPS = 0.000000001;
double a[N][N], SOL[N];
int n, m;

int main(){
	freopen("gauss.in", "r", stdin);
	freopen("gauss.out", "w", stdout);
	int i, j;
	scanf("%d %d", &n, &m);
	for(i = 1; i <= n; ++i)
		for(j = 1; j <= m + 1; ++j)
			scanf("%lf", &a[i][j]);
	i = 1;	j = 1;	int k, aux;
	while(i <= n && j <= m){
		for(k = i; k <= n; ++k)
			if(a[k][j] < -EPS || a[k][j] > EPS)
				break;
		
		if(k == n + 1){
			++j;
			continue;
		}

		if(k != i)
			for(int q = 1; q <= m + 1; ++q){
				aux = a[i][q];
				a[i][q] = a[k][q];
				a[k][q] = aux;
			}

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

		for(int u = i + 1; u <= n; ++u){
			for(int c = j + 1; c <= m + 1; ++c)
				a[u][c] -= a[i][c] * a[u][j];
			a[u][j] = 0;
		}
		
		++i; ++j;
	}

	for(i = n; i; --i)
		for(j = 1; j <= m + 1; ++j)
			if(a[i][j] < -EPS || a[i][j] > EPS){
				if(j == m + 1){
					printf("Imposibil\n");
					return 0;
				}
				
				SOL[j] = a[i][m + 1];
				for(k = j + 1; k <= m; ++k)
					SOL[j] -= SOL[k] * a[i][k];
				break;
			}
	
	for(i = 1; i <= m; ++i)
		printf("%.8lf ", SOL[i]);

	return 0;
}