Cod sursa(job #662966)

Utilizator deividFlorentin Dumitru deivid Data 17 ianuarie 2012 15:48:54
Problema Algoritmul lui Gauss Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include<stdio.h>

#define maxDim 305
#define eps 1e-7

FILE*f=fopen("gauss.in","r");
FILE*g=fopen("gauss.out","w");

int n,m,i,j,k,ii,jj,ok = 1; double x;
double A[maxDim][maxDim],Sol[maxDim];

inline void citire () {
	
	fscanf(f,"%d %d",&n,&m);
	
	for ( i = 1 ; i <= n ; ++i ){
		for ( j = 1 ; j <= m + 1 ; ++j ){
			fscanf(f,"%lf",&A[i][j]);
		}
	}
}

inline double abs ( double j ){
	if ( j < 0 )
		return -j;
	return j;
}

inline bool equal ( double a , double b ){
	if ( abs(a-b) < eps )
		return 1;
	return 0;
}

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

inline void gauss () {
	
	for ( i = j = 1 ; i <= n && j <= m ; ){
		
		for ( k = 1 ; k <= n ; ++k ){
			if ( !equal(A[k][j],0.0) )
				break ;
		}
		
		if ( k == n + 1 ){
			++j;
			continue ;
		}
		
		if ( i != k ){
			for ( ii = 1 ; ii <= m + 1 ; ++ii ){
				swap(A[i][ii],A[k][ii]);
			}
		}
		for ( ii = j + 1 ; ii <= m + 1 ; ++ii ){
			A[i][ii] /= A[i][j];
		}
		A[i][j] = 1;
		
		for ( ii = i + 1 ; ii <= n ; ++ii ){
			x = A[ii][j];
			for ( jj = 1 ; jj <= m + 1 ; ++jj ){
				A[ii][jj] = A[i][jj] * x - A[ii][jj];
			}
		}
		
		++i; ++j;
	}
	
	for ( i = n ; i >= 1 && ok ; --i ){
		for ( j = 1 ; j <= m + 1 ; ++j ){
			if ( !equal(A[i][j],0.0) ){
				if ( j == m + 1 ){
					ok = 0; break ;
				}
				Sol[j] = A[i][m+1];
				for ( ii = j + 1 ; ii <= m ; ++ii ){
					Sol[j] -= A[i][ii] * Sol[ii];
				}
				break ;
			}
		}
	}
}

inline void afisare () {
	
	if ( !ok ){
		fprintf(g,"Imposibil\n");
	}
	else{
		for ( ii = 1 ; ii <= m ; ++ii ){
			fprintf(g,"%.8lf ",Sol[ii]);
		}
		fprintf(g,"\n");
	}
}

int main () {
	
	citire();
	gauss();
	afisare();
	
	fclose(f);
	fclose(g);
	
	return 0;
}