Cod sursa(job #1648089)

Utilizator zVoxtyVasile Sebastian Costinel zVoxty Data 11 martie 2016 00:37:20
Problema Algoritmul lui Gauss Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <cstdio>

using namespace std;

#define MAXN 310
#define EPS 0.0000001

int N, M;
double A[MAXN][MAXN];
double X[MAXN];

int i = 1, j = 1, k;
double aux;

void readMatrix() {
	freopen("gauss.in", "r", stdin);
	scanf("%d%d", &N, &M);
	for (int i = 1; i <= N; ++i)
		for (int j = 1; j <= M + 1; ++j)
			scanf("%d", &A[i][j]);
}

void Gauss() {
	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)
			for (int l = 1; l <= M + 1; ++l)
			{
				aux = A[i][l];
				A[i][l] = A[k][l];
				A[k][l] = aux;
			}


		for (int l = j + 1; l <= M + 1; ++l)
			A[i][l] = A[i][l] / A[i][j];
		A[i][j] = 1;


		for (int u = i + 1; u <= N; ++u)
		{
			for (int l = j + 1; l <= M + 1; ++l)
				A[u][l] -= A[u][j] * A[i][l];
			A[u][j] = 0;
		}

		++i; ++j;
	}
}

void Print() {
	freopen("gauss.out", "w", stdout);
	for (int i = 1; i <= M; ++i)
		printf("%.lf ", X[i]);
	printf("\n");
}

int main()
{
	
	readMatrix();
	Gauss();
	for (int i = N; i > 0; --i) {
		for (int j = 1; j <= M + 1; ++j) {
			if (A[i][j] > EPS || A[i][j] < -EPS)
			{

				if (j == M + 1)
				{
					freopen("gauss.out", "w", stdout);
					printf("Imposibil");
					return 0;
				}


				X[j] = A[i][M + 1];
				for (int k = j + 1; k <= M; ++k)
					X[j] -= X[k] * A[i][k];

				break;
			}
		}
	}
	Print();

	return 0;
}