Cod sursa(job #676702)

Utilizator NikitaUtiuNichita Utiu NikitaUtiu Data 9 februarie 2012 15:36:20
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <cstdio>
#include <vector>
#include <iostream>
using namespace std;

#define EPS 0.00000001
#define notzero(a) (!(a > -EPS && a < EPS))

vector <vector <double> > coef;
vector <double> results;
int n, m;

int main(void) {
	FILE* fin = fopen("gauss.in", "r");
	fscanf(fin, "%d %d", &n, &m);
	
	coef.resize(n, vector <double>  (m+1));
	results.resize(m);
	for(int i = 0; i < n; ++i)
		for(int j = 0; j <= m; ++j)
			fscanf(fin, "%lf", &coef[i][j]);
	fclose(fin);
	
	int lin = 0, col = 0;
	while(lin < n && col < m) {
		int i;
		for(i = col; i < n; ++i)
			if(notzero(coef[i][col]))
				break;
		if(i == n) {
			++col; // variabila nedeterminata
			continue;
		}
		
		if(i != lin) {
			int aux;
			for(int j = 0; j <= m; ++j)
			{
				aux = coef[lin][j];
				coef[lin][j] = coef[i][j];
				coef[i][j] = aux;	
			}
		} 
		for(int i = col + 1; i <= m; ++i) 
			coef[lin][i] /= coef[lin][col];
		coef[lin][col] = 1;
		for(int i = lin + 1; i < n; ++i) {
			for(int j = col + 1;  j <= m; ++j)
				coef[i][j] -= coef[i][col] * coef[lin][j];
			coef[i][col] = 0;
		}
		++col; ++ lin;
	}
	
	FILE* fout = fopen("gauss.out", "w");
	for(int i = n - 1; i >= 0; --i)
		for(int j = 0; j <= m; ++j)
			if(notzero(coef[i][j])) {
				if(j == m) {
					fprintf(fout, "Imposibil");
					return 0;
				}
				results[j] = coef[i][m];
				for(int k = j + 1; k <= m; ++k)
					results[j] -= results[k] * coef[i][k];
				break;
			}
	
	for(int i = 0; i < m; ++i)
		fprintf(fout, "%.8lf ", results[i]);
}