Cod sursa(job #675653)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 7 februarie 2012 21:51:54
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>
#include <iomanip>
#define NMAx 310
#define EPS 0.000000001
#define nonZero(a) ((a)<-EPS||EPS<(a))
using namespace std;
int n,m;
double A[NMAx][NMAx],sol[NMAx];


void citire() {
	
	int i,j;
	ifstream in("gauss.in");
	in>>n>>m;
	
	for(i=1;i<=n;i++)
		for(j=1;j<=m+1;j++)
			in>>A[i][j];
	
	in.close();

}
int main() {
	
	citire();
	
	int i,j,k,p,x,y;
	
	for(i=1,j=1;(i<=n&&j<=m);i++,j++) {
		
		for(k=i;k<=n;k++)
			if(nonZero(A[k][j]))
				break;
		
		if(k==n+1) 
			continue;
		
		if(k!=i)
			for(p=1;p<=m+1;p++)
				swap(A[i][p],A[k][p]);
		
		for(p=j+1;p<=m+1;p++)
			A[i][p]/=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[i][y]*A[x][j];
			A[x][j]=0;
			}
		
		}
	
	for(i=n;i>=1;i--)
		for(j=1;j<=m+1;j++)
			if(nonZero(A[i][j])) {
				
				if(j==m+1)
					i=0;
				else {
					sol[j]=A[i][m+1];
					for(k=j+1;k<=m;k++)
						sol[j]-=sol[k]*A[i][k];
					}
				
				break;
				}
	
	ofstream out("gauss.out");
	
	if(i==-1)
		out<<"Imposibil";
	else
		for(i=1;i<=m;i++)
			out<<fixed<<setprecision(11)<<sol[i]<<' ';
	
	out<<'\n';
	out.close();
	
	return 0;
}