Cod sursa(job #717455)

Utilizator Robert29FMI Tilica Robert Robert29 Data 19 martie 2012 22:16:45
Problema Algoritmul lui Gauss Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include<stdio.h>
FILE*f=fopen("gauss.in","r");
FILE*g=fopen("gauss.out","w");
int n,m,u,i,j,t,tt,ok;
double y,v[302],aux,x,a[302][302];
double intreg (double a)
{
	if(a<0)
		return -a;
	return a;
}
inline int min(int a,int b)
{
	if(a<b)
		return a;
	return b;
}
int main()
{
	fscanf(f,"%d%d",&n,&m);
	for(i=1;i<=n;++i)
		for(j=1;j<=m+1;++j)
			fscanf(f,"%lf",&a[i][j]);
		
	x=min(n,m-1);
	
	for(i=1;i<=x;++i)
		for(j=i+1;j<=n;++j)
		{
			t=i;
			while(!a[t][i])
				++t;
			for(tt=i;tt<=m+1;++tt)
			{
				aux=a[i][tt];
				a[i][tt]=a[t][tt];
				a[t][tt]=aux;
			}
			y=a[j][i]/a[i][i];
			a[j][i]=0;
			for(t=i+1;t<=m+1;++t)
				a[j][t]-=y*a[i][t];
		}
	
	if(n==m)
	{
		for(i=m;i;--i)
		{
			for(j=m;j>i;--j)
				a[i][m+1]-=v[j]*a[i][j];
			v[i]=a[i][m+1]/a[i][i];
		}
		for(i=1;i<=m;++i)
			fprintf(g,"%.8lf ",v[i]);
	}
	else if(n>m)
	{
		v[m]=a[n][m+1]/a[n][m];
		for(i=m+1;i<=n;++i)
			if(intreg(v[m]-a[i][m+1]/a[i][m])>0.0000000001)
			{
				ok=1;
				fprintf(g,"Imposibil");
				break;
			}
		if(!ok)
		{
			for(i=m-1;i;--i)
			{
				for(j=m;j>i;--j)
					a[i][m+1]-=v[j]*a[i][j];
				v[i]=a[i][m+1]/a[i][i];
			}
			for(i=1;i<=m;++i)
				fprintf(g,"%.8lf ",v[i]);
		}			
	}
	else
	{
		for(i=n;i;--i)
		{
			for(j=m;j>i;--j)
				a[i][m+1]-=v[j]*a[i][j];
			v[i]=a[i][m+1]/a[i][i];
		}
		for(i=1;i<=m;++i)
			fprintf(g,"%.8lf ",v[i]);
	}

	fclose(f);
	fclose(g);
	return 0;
}