Cod sursa(job #847852)

Utilizator alex_unixPetenchea Alexandru alex_unix Data 4 ianuarie 2013 16:15:12
Problema Algoritmul lui Gauss Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb

#include <cstdio>

const int MAX_SIZE(301);
const double GUARD(0.0000001);

int n, m;
double matrix [MAX_SIZE] [MAX_SIZE];
double unknown [MAX_SIZE];
double result [MAX_SIZE];
bool error;

inline void read (void)
{
	std::freopen("gauss.in","r",stdin);
	std::scanf("%d %d",&n,&m);
	int i, j;
	for (i = 1 ; i <= n ; ++i)
	{
		for (j = 1 ; j <= m ; ++j)
			std::scanf("%lf",&matrix[i][j]);
		std::scanf("%lf",result + i);
	}
	std::fclose(stdin);
}

inline void print (void)
{
	std::freopen("gauss.out","w",stdout);
	if (error)
		std::printf("Imposibil\n");
	else
		for (double *iterator(unknown + 1), *end(unknown + m) ; iterator <= end ; ++iterator)
			std::printf("%.10lf ",*iterator);
	std::fclose(stdout);
}

inline void swap (double &a, double &b)
{
	double temp(a);
	a = b;
	b = temp;
}

inline void compute (void)
{
	int i(1), j(1), k, index;
	while (i <= n && j <= m)
	{
		for (k = i ; k <= n ; ++k)
			if (matrix[k][j] < -GUARD || matrix[k][j] > GUARD)
				break;
		if (k > n)
		{
			++j;
			continue;
		}
		if (k != i)
		{
			for (index = 1 ; index <= m ; ++index)
				swap(matrix[i][index],matrix[k][index]);
			swap(result[i],result[k]);
		}
		for (index = j + 1 ; index <= m ; ++index)
			matrix[i][index] /= matrix[i][j];
		result[i] /= matrix[i][j];
		matrix[i][j] = 1;
		for (k = i + 1 ; k <= n ; ++k)
		{
			for (index = j + 1 ; index <= m ; ++index)
				matrix[k][index] -= matrix[i][index] * matrix[k][j];
			result[k] -= result[i] * matrix[k][j];
			matrix[k][j] = 0;
		}
		++i;
		++j;
	}
	for (i = n ; i ; --i)
	{
		for (j = 1 ; j <= m ; ++j)
			if (matrix[i][j] < -GUARD || matrix[i][j] > GUARD)
				break;
		if (j > m && result[i])
		{
			error = true;
			break;
		}
		unknown[j] = result[i];
		for (k = j + 1 ; k <= m ; ++k)
			unknown[j] -= matrix[i][k] * unknown[k];
	}
}

int main (void)
{
	read();
	compute();
	print();
	return 0;
}