Cod sursa(job #737615)

Utilizator GrimpowRadu Andrei Grimpow Data 19 aprilie 2012 19:40:19
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <cstdio>
#define nmax 310
#define eps 0.0000001

int n, m;
double a[nmax][nmax], val[nmax];

void swap(int x, int y)
{
	int i;
	double aux;
	for (i=1; i<=m+1; i++)
	{
		aux=a[x][i];
		a[x][i]=a[y][i];
		a[y][i]=aux;
	}
}

int main()
{
	freopen("gauss.in","r",stdin);
	freopen("gauss.out","w",stdout);
	scanf("%d %d", &n, &m);
	int i, j, k, x, y;
	for (i=1; i<=n; i++)
		for (j=1; j<=m+1; j++) scanf("%lf", &a[i][j]);
	for (i=1, j=1; i<=n && j<=m; )
	{
		for (k=i; k<=n; k++)
			if (a[k][j]<-eps || a[k][j]>eps) break;
		if (k>n) j++; else
		{
			if (i!=k) swap(i, k);
			for (y=j+1; y<=m+1; y++) a[i][y]/=a[i][j];
			a[i][j]=1;
			for (x=i+1; x<=n; x++)
			{
				for (y=j+1; y<=m+1; y++) 
					a[x][y]-=a[x][j]*a[i][y];
				a[x][j]=0;
			}
			i++, j++;
		}
	}
	for (i=n; i>0; 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 0;
				}
				val[j]=a[i][m+1];
				for (k=j+1; k<=m; k++) val[j]-=val[k]*a[i][k];
				break;
			}
	for (i=1; i<=m; i++) printf("%.8lf ",val[i]);
}