Cod sursa(job #623547)

Utilizator stay_awake77Cangea Catalina stay_awake77 Data 20 octombrie 2011 10:35:50
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <cstdio>

#define NMAX 310
#define Err 1e-7

using namespace std;

double A[NMAX][NMAX], Sol[NMAX], x;
int N, M, i, j, k, l;

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]);
	
	i = j = 1;
	while( i <= N && j <= M )
	{
		for( k = i; k <= N; ++k )
			if( A[k][j] > Err || A[k][j] < -Err )
				break;
		
		if( k == N+1 )
		{
			++j;
			continue;
		}
		
		if( k != i )
			for( int ii = 1; ii <= M+1; ++ii )
				x = A[i][ii], A[i][ii] = A[k][ii], A[k][ii] = x;
		
		for( k = j+1; k <= M+1; ++k )
			A[i][k] = A[i][k] / A[i][j];
		A[i][j] = 1.0;
		
		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.0;
		}
		
		++i, ++j;
	}
	
	for( i = N; i >= 1; --i )
		for( j = 1; j <= M+1; ++j )
			if( A[i][j] > Err || A[i][j] < -Err )
			{
				if( j == M+1 )
				{
					printf("Imposibil\n");
					return 0;
				}
				
				Sol[j] = A[i][M+1];
				for( k = j+1; k <= M; ++k )
					Sol[j] -= A[i][k] * Sol[k];
				
				break;
			}
	
	for( i = 1; i <= M; ++i )
		printf("%.8lf ", Sol[i]);
	printf("\n");
	
	return 0;
}