Cod sursa(job #1025854)

Utilizator roots4Irimia Alexandru Gabriel roots4 Data 10 noiembrie 2013 17:20:13
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include<fstream>
#include<iomanip>
#include<string.h>

using namespace std;

#define max_n 305
#define eps 0.0000001

ifstream f("gauss.in");
ofstream g("gauss.out");

int n , m;
double V[max_n][max_n] , Sol[max_n] , aux[max_n];

inline double abs( double x ){
	return x < 0 ? -x : x;
}

inline bool zero( double x ){
	return abs(x) < eps ? 1 : 0; 
}

inline void read(){
	
	f>>n>>m;
	
	for( int j , i = 1 ; i <= n ; i++ )
		for( j = 1 ; j <= m + 1 ; j++ )
			f>>V[i][j];
	
}

void solve(){
	
	int i = 1 , j = 1 , k , i1 , j1;
	double d;
	
	while( i <= n && j <= m ){
		
		for( k = i ; k <= n && zero(V[k][j]) ; k++ );
		
		if( k > n ){
			j++;
			continue;
		}
		
		if( k != i ){
			memcpy( aux , V[i] , sizeof(aux) );
			memcpy( V[i] , V[k] , sizeof(aux) );
			memcpy( V[k] , aux , sizeof(aux) );
		}
		
		d = V[i][j]; V[i][j] = 1;
		
		for( k = j+1 ; k <= m + 1 ; k++ )
			V[i][k] /= d;
		
		for( i1 = i + 1 ; i1 <= n ; i1++ ){
			for( j1 = j + 1 ; j1 <= m + 1 ; j1++ )
				V[i1][j1] -= V[i][j1] * V[i1][j];
			V[i1][j] = 0;
		}
		
		i++; j++;
	}
	
	for( i = n ; i >= 1 ; i-- ){
		for( j = 1 ; j <= m+1 ; j++ ){
			if( !zero(V[i][j]) ){
				
				if( j == m+1 ){
					g<<"Imposibil\n";
					return;
				}
				
				Sol[j] = V[i][m+1];
				
				for( k = j+1 ; k <= m ; k++ )
					Sol[j] -= V[i][k]*Sol[k];
				
				break;
			}
		}
	}
	
	for( i = 1 ; i <= m ; i++ ){
		g<<fixed<<setprecision(8)<<Sol[i]<<" ";
	}
	g<<"\n";
}

int main(){
	
	read();
	
	solve();
	
	return 0;
}