Cod sursa(job #676674)

Utilizator darrenRares Buhai darren Data 9 februarie 2012 15:10:36
Problema Algoritmul lui Gauss Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>
#include <iomanip>
#include <algorithm>

using namespace std;

const int eps = 0.000001;

int N, M;
double A[302][302], X[302];
bool impossible;

int main()
{
	ifstream fin("gauss.in");
	ofstream fout("gauss.out");
	
	fin >> N >> M;
	for (int i = 1; i <= N; ++i)
		for (int j = 1; j <= M + 1; ++j)
			fin >> A[i][j];
	
	int j = 1;
	for (int i = 1; i <= N && j <= M; ++i, ++j)
	{
		int k;
		for (k = i; k <= N; ++k)
			if (A[k][j] < -eps || A[k][j] > eps)
				break;
		if (k == N + 1)
		{
			++j;
			continue;
		}
		
		for (int l = 1; l <= M + 1; ++l)
			swap(A[i][l], A[k][l]);
		for (int l = j + 1; l <= M + 1; ++l)
			A[i][l] /= A[i][j];
		A[i][j] = 1;
		
		for (int l = i + 1; l <= N; ++l)
		{
			for (int m = j + 1; m <= M + 1; ++m)
				A[l][m] -= A[i][m] * A[l][j];
			A[l][j] = 0;
		}
	}
	
	for (int i = M; i >= 1; --i)
		for (int j = 1; j <= M + 1; ++j)
			if (A[i][j] < -eps || A[i][j] > eps)
			{
				if (j == M + 1)
				{
					impossible = true;
					break;
				}
				
				X[j] = A[i][M + 1];
				for (int k = i - 1; k >= 1; --k)
				{
					 A[k][M + 1] -= X[j] * A[k][j];
					 A[k][j] = 0;
				 }
				 break;
			}
	
	if (impossible)
		fout << "Imposibil";
	else
		for (int i = 1; i <= M; ++i)
			fout << fixed << setprecision(8) << X[i] << ' ';
	fout << '\n';
	
	fin.close();
	fout.close();
}