Cod sursa(job #743498)

Utilizator FlorianFlorian Marcu Florian Data 4 mai 2012 18:20:40
Problema Algoritmul lui Gauss Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
using namespace std;
#include<cstdio>
const double EPS = 0.0000001;
const int MAX_N = 307;
int N, M;
double A[MAX_N][MAX_N], X[MAX_N];
void printA() {
	int i, j;
	for(i = 1; i <= N; ++i)
	{
		for(j = 1; j <= M + 1; ++j)
			printf("%lf ", A[i][j]);
		printf("\n");
	}
	printf("\n\n");
}
int main() {
	freopen("gauss.in", "r", stdin); freopen("gauss.out", "w", stdout);
	scanf("%d%d", &N, &M);
	int i, j, k, x;
	bool ok;
	double z;
	for(i = 1; i <= N; ++i)
		for(j = 1; j <= M + 1; ++j)
			scanf("%lf", &A[i][j]);
	i = 1; j = 1;
	while(i <= N && j <= M) {
		 x = i;
		 while(x <= N && A[x][j] <= EPS && A[x][j] >= -EPS) ++x;
		 if(x == N + 1) {
			++j;
			continue;
		 }
		 if(x != i) {
			 for(k = j; k <= M + 1; ++k) {
				 double tmp = A[x][k];
				 A[x][k] = A[i][k];
				 A[i][k] = tmp;
			 }		 
		 }
		 for(x = i + 1; x <= N; ++x) {
			 z = A[x][j] / A[i][j];
			 for(k = j; k <= M + 1; ++k)
				 A[x][k] -= z * A[i][k];
		 }
		 ++i; ++j;
		// printA();
	}
	i = N; j = 1;
	while( i > 0) {
		for(j = 1; j <= M + 1; ++j)
			if( j <= M  && (A[i][j] < -EPS || A[i][j] > EPS)) {
				X[j] = A[i][M+1];
				for(k = j + 1; k <= M; ++k)
					X[j] -= X[k] * A[i][k];
				X[j] /= A[i][j];
			break;
			}
			else if(j == M + 1) {
				printf("Imposibil\n");
				return 0;
			}
		--i;
	}
	for(i = 1; i <= M; ++i)
		printf("%.10lf ", X[i]);
	printf("\n");
	return 0;

}