Cod sursa(job #2554090)

Utilizator CyborgSquirrelJardan Andrei CyborgSquirrel Data 22 februarie 2020 16:24:39
Problema Algoritmul lui Gauss Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <iomanip>
#include <cmath>

using namespace std;

typedef long double ld;

ifstream fin("gauss.in");
ofstream fout("gauss.out");

int n, m;
vector<ld> gau[314];

ld sol[314];

void div(vector<ld> &v, ld a){
	for(auto &b : v){
		b /= a;
	}
}

void sum(vector<ld> &v1, const vector<ld> &v2, ld a){
	for(int i = 0; i < v1.size(); ++i){
		v1[i] += a*v2[i];
	}
}

void deb(){
	for(int i = 0; i < n; ++i){
		for(auto a : gau[i]){
			cout << a << "\t";
		}
		cout << "\n";
	}
}

int main(){
	fin >> n >> m;
	for(int i = 0; i < n; ++i){
		for(int j = 0; j <= m; ++j){
			ld a;fin >> a;
			gau[i].push_back(a);
		}
	}
	
	for(int i = 0; i < m; ++i){
		bool found = false;
		for(int j = i; j < n; ++j){
			if(gau[j][i] != 0){
				swap(gau[j], gau[i]);
				found = true;
				break;
			}
		}
		if(found){
			div(gau[i], gau[i][i]);
			for(int j = i+1; j < n; ++j){
				sum(gau[j], gau[i], -gau[j][i]);
			}
		}
	}
	
	bool fml = false;
	for(int i = m-1; i >= 0; --i){
		if(abs(gau[i][i]) <= 0.0000000001){
			fml = true;
		}
		ld v = gau[i][m];
		for(int j = i; j < m; ++j){
			v -= sol[j]*gau[i][j];
		}
		sol[i] = v;
	}
	
	if(!fml){
		fout << setprecision(10) << fixed;
		for(int i = 0; i < n; ++i){
			fout << sol[i] << " ";
		}
	}else{
		fout << "Imposibil";
	}
	return 0;
}