Cod sursa(job #797583)

Utilizator radustn92Radu Stancu radustn92 Data 14 octombrie 2012 14:03:57
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <stdio.h>
#define NMAX 305
#define eps 1e-6
int n,m;
double A[NMAX][NMAX],rez[NMAX];
void read()
{
	scanf("%d%d",&n,&m);
	int i,j;
	for (i=1; i<=n; i++)
		for (j=1; j<=m+1; j++)
			scanf("%lf",&A[i][j]);
}
void swap_l(int i,int k)
{
	int j;
	double aux;
	for (j=1; j<=m+1; j++)
		aux=A[i][j],A[i][j]=A[k][j],A[k][j]=aux;
}
void solve()
{
	int i=1,j=1,k,t;
	double val;
	
	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)
			swap_l(i,k);
		
		for (k=i+1; k<=n; k++)
		{
			val=A[k][j]/A[i][j];
			for (t=j; t<=m+1; t++)
				A[k][t]-=A[i][t]*val;
		}
		
		i++; j++;
	}
	
	for (i=n; i>=1; i--)
		for (j=1; j<=m+1; j++)
			if (A[i][j]<-eps || A[i][j]>eps)
			{
				if (j==m+1)
				{
					printf("Imposibil\n");
					return ;
				}
				rez[j]=A[i][m+1];
				for (t=j+1; t<=m; t++)
					rez[j]-=A[i][t]*rez[t];
				
				rez[j]/=A[i][j];
				break ;
			}
			
	for (i=1; i<=m; i++)
		printf("%.8lf ",rez[i]);
	printf("\n");
}
int main()
{
	freopen("gauss.in","r",stdin);
	freopen("gauss.out","w",stdout);
	read();
	solve();
	return 0;
}