Cod sursa(job #2878169)

Utilizator dahaandreiDaha Andrei Codrin dahaandrei Data 25 martie 2022 22:25:16
Problema Algoritmul lui Gauss Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 300;
const int MAXM = 300;

const double eps = 0.0000001;

int n, m;
double mat[MAXN + 3][MAXM + 3];
double x[MAXM + 2];

int main() {
	freopen("gauss.in", "r", stdin);
	freopen("gauss.out", "w", stdout);

	cin.tie(0);
	cout.tie(0);
	ios::sync_with_stdio(false);


	cin >> n >> m;

	for (int i = 1; i <= n; ++ i)
		for (int j = 1; j <= m + 1; ++ j)
			cin >> mat[i][j];

	int i = 1, j = 1, k;

	while (i <= n && j <= m) {
		for (k = i; k <= n; ++ k)
			if (mat[k][j] >= eps || mat[k][j] <= -eps)
				break;

		if (k == n + 1) {
			++ j;
			continue;
		}


		if (k != i) {
			for (int l = 1; l <= m + 1; ++ l) {
				double aux = mat[i][l];
				mat[i][l] = mat[k][l];
				mat[k][l] = aux;
			}
		}

		for (int l = j + 1; l <= m + 1; ++ l) {
			mat[i][l] /= mat[i][j];
		}

		mat[i][j] = 1;

		for (int u = i + 1; u <= n; ++ u) {
			for (int l = j + 1; l <= m + 1; ++ l) {
				mat[u][l] -= mat[u][j] * mat[i][l];
			}

			mat[u][j] = 0;
		}

		++ i;
 		++ j;
	}

	for (int i = n; i >= 1; -- i) {
		for (int j = 1; j <= m + 1; ++ j) {
			if (mat[i][j] > eps || mat[i][j] < -eps) {
				if (j == m + 1) {
					cout << "Imposibil\n";
					return 0;
				}

				x[j] = mat[i][m + 1];

				for (int k = j + 1; k <= m; ++ k)
					x[j] -= x[k] * mat[i][k];


				break;
			}
		}
	}

	for (int i = 1; i <= m; ++ i)
		cout << fixed << setprecision(8) << x[i] << " ";

	cout << '\n';

	return 0;
}