Cod sursa(job #1210546)

Utilizator BLz0rDospra Cristian BLz0r Data 20 iulie 2014 14:03:51
Problema Algoritmul lui Gauss Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <cstdio>
#include <algorithm>
using namespace std;

FILE *f=fopen ("gauss.in","r");
FILE *g=fopen ("gauss.out","w");

#define eps 0.0000001

double v[305][305],sol[305];
int n,m;

inline void swapline (int x, int y){
	for (int i=1;i<=m;++i) swap (v[x][i],v[y][i]);
}

int main(){
	
	fscanf (f,"%d%d",&n,&m);
	
	for (int i=1;i<=n;++i){
		for (int j=1;j<=m+1;++j){
			fscanf (f,"%lf",&v[i][j]);
		}
	}
	
	int i=1,j=1,k;
	
	while (i<=n && j<=m){
		for (k=i;k<=n;++k){
			if (v[k][j]>eps || v[k][j]<-eps){
			
				break;
			}
		}
		if (k>n){
			j++;
			continue;
		}
		if (k!=i) swapline (i,k);
		
		for (k=j+1;k<=m+1;++k) v[i][k]/=v[i][j];
		v[i][j]=1;
		
		for (k=i+1;k<=n;++k){
			for (int l=j+1;l<=m+1;++l){
				v[k][l]-=v[k][j]*v[i][l];
			}
			v[k][j]=0;
		}
		i++; j++;
	}

	for (i=n;i>=1;--i){
		for (j=1;j<=m+1;++j){
			if (v[i][j]>eps || v[i][j]<-eps){
				if (j>m){
					fprintf (g,"Imposibil");
					return 0;
				}
				sol[j]=v[i][m+1];
				for (k=j+1;k<=m;++k){
					sol[j]-=v[i][k]*sol[k];
				}
				break;
			}
		}
	}
	
	for (i=1;i<=m;++i) fprintf (g,"%.8lf ",sol[i]);
	
	return 0;
}