Cod sursa(job #767043)

Utilizator valentin.harsanValentin Harsan valentin.harsan Data 12 iulie 2012 17:30:55
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include<fstream>
#include<iomanip>
using namespace std;

ifstream in("gauss.in");
ofstream out("gauss.out");

const int N = 309;
const double eps = 0.00000001;

int n, m;
double a[N][N], x[N];

inline void swapl(const int &l1, const int &l2) {
	
	for(int i = 1; i<=m + 1; ++i) {
		double aux = a[l1][i];
		a[l1][i] = a[l2][i];
		a[l2][i] = aux;
	}
}

int main() {
	int i, j, k, l, u;
	
	in >> n >> m;
	
	for(i = 1; i<=n; ++i)
		for(j = 1; j<=m + 1; ++j)
			in >> a[i][j];
	
	i = 1; j = 1;
	
	while(i <= n && j <= m) {
		
		for(k = i; k<=n; ++k)
			if(a[k][j] < -eps || a[k][j] > eps)
				break;
		
		if(k == n + 1) {
			++j;
			continue;
		}
		
		if(k != i)
			swapl(i, k);
		
		for(l = j + 1; l<=m + 1; ++l)
			a[i][l] /= a[i][j];
		a[i][j] = 1;
		
		for(u = i + 1; u<=n; ++u) {
			
			for(l = j + 1; l<=m + 1; ++l)
				a[u][l] -= a[u][j] * a[i][l];
			a[u][j] = 0;
		}
		++i; ++j;
	}
	
	for(i = n; i; --i)
		for(j = 1; j<=m + 1; ++j)
			if(a[i][j] < -eps || a[i][j] > eps) {
				
				if(j == m + 1) {
					out << "Imposibil\n";
					return 0;
				}
				
				x[j] = a[i][m + 1];
				for(k = j + 1; k<=m; ++k)
					x[j] -= x[k] * a[i][k];
				
				break;
			}
	
	for(i = 1; i<=m; ++i)
		out << setprecision(15) << x[i] << " ";
	out << "\n";
	
	return 0;
}