Cod sursa(job #872949)

Utilizator dragosnicolaeNicolae Dragos dragosnicolae Data 6 februarie 2013 19:17:22
Problema Algoritmul lui Gauss Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include<stdio.h>
#include<math.h>
#define er 0.0000000000001
double a[305][305],x[305];
int n,m;
void cit(){
	FILE *f;
	f=fopen("gauss.in","r");
	fscanf(f,"%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m+1;j++)
			fscanf(f,"%lf",&a[i][j]);
	fclose(f);
}
void reduc(){
	int i,j,k,l;
	double b;
	i=j=1;
	while(i<=n&&j<=m){
		for(k=i;k<=n;k++)
			if(fabs(a[k][j])>=er)
				break;
		if(k==n+1)
			j++;
		else{
			for(l=j;l<=m+1;l++){
				b=a[i][l];
				a[i][l]=a[k][l];
				a[k][l]=b;
			}
			b=a[i][j];
			for(l=j;l<=m+1;l++)
				a[i][l]/=b;
			a[i][j]=1;//asr
			for(k=i+1;k<=n;k++){
				b=a[k][j];
				for(l=j;l<=m+1;l++)
					a[k][l]-=b*a[i][l];
				a[k][j]=0;//asdas
			}
			i++;
			j++;
		}
	}
}
void sol(){
	FILE *f;
	int i,j,k;
	f=fopen("gauss.out","w");
	for(i=n;i>=1;i--){
		for(j=1;j<=m;j++)
			if(fabs(a[i][j])>er)
				break;
		if(j==m+1&&fabs(a[i][m+1])>er){
			fprintf(f,"Imposibil\n");
			fclose(f);
			return ;
		}
		x[j]=a[i][m+1];
		for(k=j+1;k<=m;k++)
			x[j]-=x[k]*a[i][k];
	}
	for(i=1;i<=m;i++)
		fprintf(f,"%0.8lf ",x[i]);
	fclose(f);
}
int main(){
	cit();
	reduc();
	sol();
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m+1;j++)
			printf("%0.12lf ",a[i][j]);
		printf("\n");
	}
	return 0;
}