Cod sursa(job #848931)

Utilizator MtkMarianHagrSnaf MtkMarian Data 5 ianuarie 2013 21:48:53
Problema Algoritmul lui Gauss Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include<cstdio>
#define MAX 300
#define eps 0.0000000001
int n,m;
double a[MAX][MAX];
double REZ[MAX];

int solve_gauss()
{
	int i=1,j=1,k,l, aux,u ;
	while( i <= n && j <= m )
	{
		for(  k=i ; k <= n ; ++k )
			if(a[k][j]<-eps || a[k][j]>eps) 
				break;

		if( k == n+1 )
		{

			++j;
			continue;
		}

		if(k!= i)
			for( l=1; l<=m+1;++l)
			{
				aux=a[i][l];
				a[i][l]=a[k][l];
				a[k][l]=aux;
			}
	
	
		for(u=j+1; u <= m+1; ++u)
		     a[i][u] /=a[i][j];
	   
		a[i][j]=1;

		for (u=i+1;u<=n;++u)
		{
			for(l=j+1;l<=m+1;++l)
			
				a[u][l] -= a[u][j] * a[i][l];
		a[u][j]=0;
		}
		++i;
		++j;
		
	}



	
	
		
		for(int i=n;i>0;--i)
		for(int j=1;j<=m+1;++j)
		
			if(a[i][j]<-eps || a[i][j]>eps)
			{
				if (j == m+1)
						return 0 ;

			   
				REZ[j]=a[i][m+1];
				
				for(k=j+1;k<=m;++k)
				{
					REZ[j]  = REZ[j] - a[i][k] * REZ[k];
					
				}
				
				break;
				
			}
			
	
	return 1;

}

void citire()
{
	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]);



}
int main()
{
	freopen("gauss.in","r",stdin);
	freopen("gauss.out","w",stdout);
	
	

	citire();
	

	if ( solve_gauss() )
		for(int i=1;i<=m;++i)printf("%.8lf ",REZ[i]);
	else printf("Imposibil\n");


	return 0;
}