Cod sursa(job #718561)

Utilizator BarracudaFMI-Alex Dobrin Barracuda Data 20 martie 2012 21:28:19
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include<cstdio>
#include<algorithm>
#define dim 309
#define err 0.00000001
double sol[dim],A[dim][dim];
int n,m;
using namespace std;
void gauss(){
	int i , j;
	i = j = 1 ;
	while( i <= n && j <= m){
		int k;
		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  y = 1; y <= m+1; ++y ){
				swap(A[i][y],A[k][y]);
			}
			
		}
		
		for(int y=j+1 ; y <= m+1 ;++y )	
			A[i][y]=A[i][y]/A[i][j];
		
		A[i][j]=1;
		
		for(int x = i+1 ; x<= n; ++x){
			
			for(int y=j+1 ;y<=m+1 ;++y){
				
				A[x][y]-=A[x][j]*A[i][y];
				
			}
			A[x][j]=0;
		}
		++i;
		++j;
	}
}
int main (){
	freopen("gauss.in","r",stdin);
	freopen("gauss.out","w",stdout);
	
	scanf("%d%d",&n,&m);
	
	for(int i=1;i<=n;++i)
		for(int j=1;j<=m+1;++j)
			scanf("%lf",&A[i][j]);
	
	gauss();
	
	for(int i=n;i>=1;--i){
		
		for(int 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(int k = j+1; k <= m; ++k)
						sol[j] -= sol[k]*A[i][k];
				break;
			}
		}
	}
	for(int i=1;i<=m;i++)
		printf("%.8lf ",sol[i]);
	return 0;
}