Cod sursa(job #1700749)

Utilizator mihai995mihai995 mihai995 Data 11 mai 2016 09:02:18
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <fstream>
#include <iostream>
#include <iomanip>
#include <cstring>
#include <cmath>
using namespace std;

const int N = 300;

double coef[N][N + 1], ans[N];

inline bool zero(double d){
	return fabs(d) < 1e-6;
}
bool gauss(double a[N][N + 1], int nrEq, int nrVars, double ans[]){
	for (int x = 0, last = 0; x < nrVars; x++){
		int pos = last;
		while ( pos < nrEq && zero(a[pos][x]) )
			pos++;
		if ( pos >= nrEq ){
			for (int i = 0; i < nrEq; i++)
				a[i][x] = 0;
			continue;
		}

		double val = 1.0 / a[pos][x];
		for (int i = 0; i <= nrVars; i++){
			swap( a[last][i], a[pos][i] );
			a[last][i] *= val;
		}
		for (int y = 0; y < nrEq; y++) if ( last != y ){
			val = a[y][x];
			for (int i = 0; i <= nrVars; i++)
				a[y][i] -= val * a[last][i];
		}
		last++;
	}
	memset(ans, 0, sizeof(ans));
	for (int x = 0; x < nrEq; x++){
		int pos = 0;
		while ( pos <= nrVars && zero(a[x][pos]) )
			pos++;
		if ( pos == nrVars )
			return false;
		if ( pos < nrVars )
			ans[pos] = a[x][nrVars];
	}
	return true;
}

int main(){
	ifstream in("gauss.in");
	ofstream out("gauss.out");

	int nrEq, nrVars;

	in >> nrEq >> nrVars;
	for (int i = 0; i < nrEq; i++)
		for (int j = 0; j <= nrVars; j++)
			in >> coef[i][j];

	if ( !gauss(coef, nrEq, nrVars, ans) ) {
		out << "Imposibil\n";
		return 0;
	}
/*	for (int i = 0; i < nrEq; i++){
		for (int j = 0; j <= nrVars; j++)
			cerr << coef[i][j] << '\t';
		cerr << '\n';
	}
*/	out << setprecision(10) << fixed;
	for (int i = 0; i < nrVars; i++)
		out << ans[i] << ' ';
	out << '\n';
	return 0;
}