Pagini recente » Cod sursa (job #1190010) | Cod sursa (job #2980636) | Cod sursa (job #2578736) | Cod sursa (job #1056759) | Cod sursa (job #1470739)
#include <vector>
#include <valarray>
#include <fstream>
#include <iomanip>
using namespace std;
constexpr bool e_zero(const double d){
return -1e-7 <= d && d <= 1e-7; }
int main(){
ifstream f("gauss.in");
ofstream g("gauss.out");
int n, m;
f >> n >> m;
vector<valarray<double> > sist(n, valarray<double>(m+1));
for(auto& x : sist){
for(auto& y : x){
f >> y; } }
for(int rand_cur = 0, var_de_rez = 0;
rand_cur < n && var_de_rez < m;
++rand_cur, ++var_de_rez){
{
int rand_real = rand_cur;
while(rand_real < n && e_zero(sist[rand_real][var_de_rez])){
++rand_real; }
if(rand_real >= n){
continue; }
swap(sist[rand_cur], sist[rand_real]); }
const double d = sist[rand_cur][var_de_rez];
sist[rand_cur] /= d;
for(int rand_sec = 0; rand_sec < n; ++rand_sec){
if(rand_sec != rand_cur){
const double factor = sist[rand_sec][var_de_rez];
sist[rand_cur] *= factor;
sist[rand_sec] -= sist[rand_cur];
sist[rand_cur] /= factor; } }
//sist[rand_cur][var_de_rez] = 1; }
}
if(any_of(begin(sist), end(sist), [m](const valarray<double>& v){
return all_of(begin(v), end(v)-1, e_zero) &&
!e_zero(v[m]); })){
g << "Imposibil";
return 0; }
vector<double> rez(m, 0);
int j = 0;
for(int i = 0; i < n; ++i){
for( ; j < m && e_zero(sist[i][j]); ++j);
if(j < m){
rez[j] = sist[i][m]; } }
g << fixed << setprecision(10);
for(const auto x : rez){
g << x << '\n'; }
return 0; }