Cod sursa(job #2909262)

Utilizator iancupoppPopp Iancu Alexandru iancupopp Data 10 iunie 2022 17:26:40
Problema Algoritmul lui Gauss Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb
#include <fstream>
#include <vector>
#include <iomanip>

using namespace std;

const double EPS = 1e-9;

bool gauss(vector<vector<double>>& a, vector<double>& ans) {
  auto isNull = [](double x) {
    return abs(x) <= EPS;
  };
  
  int nl = a.size();
  int nc = a[0].size();
  vector<int> row(nc - 1, -1);

  int i = 0, j = 0;
  while (i < nl && j < nc - 1) {
    int piv = i;
    for (int i2 = i; i2 < nl; ++i2) {
      if (a[i2][j] > a[piv][j]) {
        piv = i2;
      }
    }

    if (isNull(a[piv][j])) {
      ++j;
      continue;
    }
    row[j] = i;

    for (int j2 = j; j2 < nc; ++j2) {
      swap(a[i][j2], a[piv][j2]);
    }

    for (int i2 = 0; i2 < nl; ++i2) {
      if (i2 == i) {
        continue;
      }
      double c = a[i2][j] / a[i][j];
      for (int j2 = j; j2 < nc; ++j2) {
        a[i2][j2] -= a[i][j2] * c;
      }
    }

    ++i, ++j;
  }

  ans.assign(nc - 1, 0);
  for (j = 0; j < nc - 1; ++j) {
    if (row[j] != -1) {
      if (!isNull(a[row[j]][nc - 1]) && isNull(a[row[j]][j])) {
        return false;
      }
      ans[j] = a[row[j]][nc - 1] / a[row[j]][j];
    }
  }

  for (i = 0; i < nl; ++i) {
    double sum = 0;
    for (j = 0; j < nc - 1; ++j) {
      sum += a[i][j] * ans[j];
    }
    if (!isNull(a[i][nc - 1] - sum)) {
      return false;
    }
  }

  return true;
}

int main() {
  ifstream cin("gauss.in");
  ofstream cout("gauss.out");
  int nl, nc;
  cin >> nl >> nc;
  ++nc;
  vector<vector<double>> a(nl, vector<double>(nc));
  for (int i = 0; i < nl; ++i) {
    for (int j = 0; j < nc; ++j) {
      cin >> a[i][j];
    }
  }
  cin.close();

  vector<double> ans;
  if (gauss(a, ans)) {
    for (auto i: ans) {
      cout << fixed << setprecision(10) << i << " ";
    }
  } else {
    cout << "Imposibil";
  }
  cout.close();
  return 0;
}