Cod sursa(job #1755074)

Utilizator Cristian1997Vintur Cristian Cristian1997 Data 9 septembrie 2016 13:01:16
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
using namespace std;
#include <fstream>
#include <vector>
#include <algorithm>
#include <string>
#include <iomanip>
using ll = long long;
using uint = unsigned int;
using ull = unsigned long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
#define NMAX 302
#define MMAX 302
#define EPS 0.0000001

double a[MMAX][NMAX];
double x[NMAX];

int main()
{
	int i, j, k, l, n, m;
	ifstream fin("gauss.in");
	ofstream fout("gauss.out");

	fin >> m >> n;
	for (i = 1; i <= m; ++i)
		for (j = 1; j <= n + 1; ++j) fin >> a[i][j];

	for (i = j = 1; i <= m && j <= n; )
	{
		for (k = i; k <= m; ++k)
			if (a[k][j] < -EPS || a[k][j] > EPS) break;

		if (k > m) { ++j; continue; }
		if (k != i) { for (l = j; l <= n + 1; ++l) swap(a[i][l], a[k][l]); }

		for (l = j + 1; l <= n + 1; ++l) a[i][l] /= a[i][j]; a[i][j] = 1;

		for (k = i + 1; k <= m; ++k)
		{
			for (l = j + 1; l <= n + 1; ++l) a[k][l] -= a[i][l] * a[k][j];
			a[k][j] = 0;
		}

		++i; ++j;
	}

	for (i = m; i >= 1; --i)
	{
		for (j = 1; j <= n + 1; ++j)
			if (a[i][j] < -EPS || a[i][j] > EPS)
			{
				if (j == n + 1)
				{
					fout << "Imposibil\n";
					return 0;
				}

				x[j] = a[i][n + 1];
				for (l = j + 1; l <= n; ++l) x[j] -= x[l] * a[i][l];

				break;
			}
	}

	for (j = 1; j <= n; ++j) fout << fixed << setprecision(10) << x[j] << ' ';
	fout << '\n';

	fin.close();
	fout.close();

    return 0;
}