Cod sursa(job #2221400)

Utilizator Dobricean_IoanDobricean Ionut Dobricean_Ioan Data 13 iulie 2018 23:13:12
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>
#include <iomanip>
 
using namespace std;

ifstream fin ("gauss.in");
ofstream fout ("gauss.out"); 
 
const int  Dim = 305;
const double eps = 0.0000001;
 
int n,m;
double A[Dim][Dim];
double X[Dim];
 
bool Gauss();

int main()
{
	fin >> n >> m;
	for ( int i = 1; i <= n; ++i)
		for ( int j = 1;j <= m + 1; ++j)
			fin >> A[i][j];
	  if ( Gauss() == false)
		fout << "Imposibil";
	else
		for ( int i = 1; i <= m; ++i)
			fout << fixed << setprecision(10) << X[i] << " ";
 
    return 0;
}


bool Gauss() {
	
	int ec = 1,var = 1;
	while ( ec <= n and var <= m) {
		int cec = ec;
		for ( cec = ec; cec <= n; ++cec)
			if ( A[cec][var] < -eps or A[cec][var] > eps)
				break;
		if ( cec == n + 1){ 
			++var;
			continue;
		}
		if ( cec != ec)  {
			for ( int j = 1; j <= m + 1; ++j)
				swap(A[ec][j], A[cec][j]);				
		}
		for ( int j = var+1; j <= m + 1; ++j)
			A[ec][j] /= A[ec][var];
		A[ec][var] = 1;
		  for(int i = ec+1; i <= n; ++i) {
            for(int j = var+1; j <= m+1; ++j)
                A[i][j] -= A[i][var] * A[ec][j];
            A[i][var] = 0;
        }
		++var, ++ec;	
	}
	for ( int i = n; i >= 1; --i)
		for  ( int j = 1; j <= m + 1; ++j)
			if ( A[i][j] > eps or A[i][j] < -eps ) {
				if ( j == m + 1) 
					return false;
				X[j] = A[i][m+1];
				for ( int w = j + 1; w <= m; ++w)
					X[j] -= X[w] * A[i][w];
			break;
			}
	return true;
}