Pagini recente » Cod sursa (job #29972) | Arhiva de probleme | Cod sursa (job #673329) | Cod sursa (job #1826285) | Cod sursa (job #1642479)
#include <fstream>
#include <vector>
#include <utility>
#include <algorithm>
#include <iomanip>
#include <iostream>
using namespace std;
bool e_zero(const double d){
return d < 1e-6 && d > -1e-6; }
void do_gauss(const int n_ec, const int n_var, vector<vector<double> >& mat, vector<double>& rez, bool& bad){
for(int ec = 0, var = 0; ec < n_ec && var < n_var; ){
{
int i = ec;
while(i < n_ec && e_zero(mat[i][ec])){
++i; }
if(i == n_ec){
++var;
continue; }
swap(mat[ec], mat[i]); }
for(int i = ec+1; i < n_ec; ++i){
const double mult = mat[i][var] / mat[ec][var];
for(int j = var; j <= n_var; ++j){
mat[i][j] -= mult * mat[ec][j]; } }
++var, ++ec; }
for(int i = 0; i < n_ec; ++i){
if(all_of(mat[i].begin(), mat[i].begin() + n_var, e_zero) && !e_zero(mat[i].back())){
bad = true;
return; } }
for(int i = n_ec-1; i >= 0; --i){
int var = 0;
while(e_zero(mat[i][var]) && var < n_var){
++var; }
if(var == n_var){
continue; }
for(int j = var+1; j < n_var; ++j){
rez[var] -= mat[i][j] * rez[j]; }
rez[var] += mat[i][n_var];
rez[var] /= mat[i][var]; } }
int main(){
ifstream f("gauss.in");
ofstream g("gauss.out");
int n, m;
f >> n >> m;
vector<vector<double> > v(n, vector<double>(m+1, 0));
for(int i = 0; i < n; ++i){
for(int j = 0; j <= m; ++j){
f >> v[i][j]; } }
vector<double> rez(m);
bool bad = false;
do_gauss(n, m, v, rez, bad);
if(bad){
g << "Imposibil\n";
return 0; }
g << fixed << setprecision(10);
for(int i = 0; i < m; ++i){
g << rez[i] << ' '; }
return 0; }