Cod sursa(job #1144692)

Utilizator BeilandArnoldArnold Beiland BeilandArnold Data 17 martie 2014 14:25:41
Problema Algoritmul lui Gauss Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>
#include <vector>
#include <iomanip>
using std::vector;

const long double EPS=0.0000000001L;

inline bool egal(long double a, long double b){
	if(a<b) return (b-a)<EPS;
	else return (a-b)<EPS;
}

int main(){
	std::ifstream fin("gauss.in");
	std::ofstream fout("gauss.out");

	unsigned n,m; fin>>n>>m;

	vector< vector<long double> > matr(n,vector<long double>(m+1));
	for(unsigned i=0;i<n;++i)
		for(unsigned j=0;j<=m;++j)
			fin>>matr[i][j];

	for(unsigned i=0,j=0; i<n && j<m; ++j, ++i){
		unsigned x=i;
		for(;x<n;++x) if(!egal(0,matr[x][j])) break;

		if(x==n) continue; //variabila libera
		else if(x!=i) matr[i].swap(matr[x]);

		for(unsigned j2=j+1;j2<=m;++j2) matr[i][j2]/=matr[i][j];
		matr[i][j]=1;

		for(unsigned i2=i+1;i2<n;++i2){
			long double z=matr[i2][j];
			for(unsigned j2=j;j2<=m;++j2) matr[i2][j2] -= z*matr[i][j2];
		}
	}

	//necunoscute
	vector<long double> x(m,0);
	bool posibil=true;

	for(int i=n-1;i>=0&&posibil;--i)
		for(unsigned j=0;j<=m&&posibil;++j)
			if(!egal(0,matr[i][j])){
				if(j==m) posibil=false;
				else{
					x[j]=matr[i][m];
					for(unsigned j2=j+1;j2<m;++j2) x[j]-=matr[i][j2]*x[j2];
				}

				break;
			}

	fout<<std::fixed<<std::setprecision(8);
	if(posibil){
		for(unsigned j=0;j<m;++j) fout<<x[j]<<' ';
		fout<<'\n';
	}
	else fout<<"Imposibil\n";
}