Cod sursa(job #658433)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 8 ianuarie 2012 20:40:58
Problema Algoritmul lui Gauss Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include<stdio.h>
#define Nmax 310
#define EPS 0.000001
#define zero(x) ( -EPS < x ) && ( x < EPS )  
double A[Nmax][Nmax], Sol[Nmax] ;
int N, M, i, j, k, l ;

void swap ( int x, int y ) 
{
	double aux ;
	
	for( int i = 1 ; i <= M ; i++ ) 
		aux = A[x][i], A[x][i] = A[y][i], A[y][i] = aux ; 
}

int main () 
{
	freopen("gauss.in","r",stdin) ;
	freopen("gauss.out","w",stdout) ;
	
	scanf("%d %d",&N,&M);
	
	for( i = 1 ; i <= N ; i++ )
		for( j = 1 ; j <= M+1 ; j++ )
			scanf("%lf",&A[i][j]);
	
	
	for( i = j = 1 ; i <= N && j <= M ; j++ )
	{
		for( k = i ; k <= N && zero(A[k][j]) ; k++ ) ;
		if( k > N ) continue ; 
		
		swap(i,k) ; 
		
		for( k = j+1 ; k <= M+1 ; k++ )
			A[i][k] /= A[i][j] ; 
		A[i][j] = 1 ;
		
		for( k = i + 1 ; k <= N ; k++ )
		{
			for( l = j+1 ; l <= M+1 ; l++ )
				A[k][l] -= A[i][l] * A[k][j] ; 
			A[k][j] = 0 ;
		}			
		
		i++; 
	}
	
	for( i = N ; i ; i-- )
	{
		for( j = 1 ; j <= M+1  && zero(A[i][j]) ; j++ ) ; 
		if( j == M + 1 ) { printf("Imposibil") ; return 0 ; } 
		if( j == M + 2 ) continue ; 
		
		for( k = j + 1 ; k <= M ; k++ )
			A[i][M+1] -= A[i][k] * Sol[k] ;
		
		Sol[j] = A[i][M+1] ; 
	}
	
	for( i = 1 ; i <= M ; i++ ) 
		printf("%lf ",Sol[i]);
	
	return 0 ; 
}