Cod sursa(job #754497)

Utilizator random.personRandom Person random.person Data 2 iunie 2012 11:53:39
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <stdio.h>
#define NMAX 305
#define eps 1e-10
int n,m;
double A[NMAX][NMAX],sol[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 l1,int l2)
{
	double aux;
	for (int i=1; i<=m+1; i++)
		aux=A[l1][i],A[l1][i]=A[l2][i],A[l2][i]=aux;
}
void solve()
{
	int i=1,j=1,k,t,poz;
	double aux;
	while (i<=n && j<=m)
	{
		poz=-1;
		for (k=i; k<=n; k++)
			if (A[k][j]<-eps || A[k][j]>eps)
			{
				poz=k;
				break ;
			}
		if (poz==-1)
		{
			j++;
			continue ;
		}
		
		if (poz!=i)
			swap_l(i,poz);
		for (k=j+1; k<=m+1; k++)
			A[i][k]/=A[i][j];
		A[i][j]=1;
		
		for (k=i+1; k<=n; k++)
		{
			aux=A[k][j];
			for (t=j; t<=m+1; t++)
				A[k][t]-=aux*A[i][t];
		}
		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 ;
				}
				sol[j]=A[i][m+1];
				for (k=m; k>j; k--)
					sol[j]-=sol[k]*A[i][k];
				break ;
			}
	for (i=1; i<=m; i++)
		printf("%.8lf ",sol[i]);
	printf("\n");
}
int main()
{
	freopen("gauss.in","r",stdin);
	freopen("gauss.out","w",stdout);
	read();
	solve();
	return 0;
}