Cod sursa(job #623532)

Utilizator The_DisturbedBungiu Alexandru The_Disturbed Data 20 octombrie 2011 10:01:52
Problema Algoritmul lui Gauss Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include<stdio.h>
float v[301][301],s[301],l;
int m,n,i,j,k;
bool fail,lol[301];
inline void test()
{
	for(i=0;i<m;i++)
	{
		for(j=0;j<=n;j++)printf("%.7f ",v[i][j]);
		printf("\n");
	}
	printf("\n\n");
}
inline void swap(int i)
{
	int j,k;
	j=i;
	while(v[j][i]==0 && j<m)j++;
	if(j==m) {fail=1;return;}
	for(k=i;k<=n;k++) l=v[i][k],v[i][k]=v[j][k],v[j][k]=l;
}
int main()
{
	freopen("gauss.in","r",stdin);
	freopen("gauss.out","w",stdout);
	scanf("%d%d",&m,&n);
	fail=0;
	if(m<n){printf("imposibil");return 0;}
	for(i=0;i<m;i++)
		for(j=0;j<=n;j++)
			scanf("%f",&v[i][j]);
	for(i=0;i<n;i++)
	{
		if(v[i][i]==0)swap(i);
		if(fail){fail=0;lol[i]=1;continue;}
		for(j=i+1;j<m;j++)
			for(k=n;k>=i;k--)
				v[j][k]=v[j][k] - v[i][k] * v[j][i] / v[i][i];
	}
	//test();
	for(i=0;i<n;i++)
		for(j=n;j>=i;j--) v[i][j]/=v[i][i];
	//test();
	for(i=n;i<m;i++) if(v[i][n]!=0){printf("imposibil");return 0;}
	s[n-1]=v[n-1][n];
	for(i=n-2;i>=0;i--)
	{
		if(lol[i])continue;
		l=0;
		for(j=n-1;j>i;j--)l+=v[i][j]*s[j];
		s[i]=v[i][n]-l;
	}
	for(i=0;i<n;i++)printf("%.7f ",s[i]);
	return 0;
}