Cod sursa(job #1479185)

Utilizator vladrochianVlad Rochian vladrochian Data 30 august 2015 18:01:58
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>
#include <iomanip>
using namespace std;

const int kMaxN = 300;
const double kEps = 1e-8;

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

int N, M;
double a[kMaxN + 5][kMaxN + 5];

int row[kMaxN];
double sol[kMaxN];

bool Zero(double d) {
  return (d > -kEps) && (d < kEps);
}

int main() {
  fin >> N >> M;
  for (int i = 1; i <= N; ++i)
    for (int j = 1; j <= M + 1; ++j)
      fin >> a[i][j];

  int r = 1, c = 1;
  while (r <= N && c <= M) {
    if (Zero(a[r][c])) {
      int i = r + 1;
      while (i <= N && Zero(a[i][c]))
        ++i;
      if (i > N) {
        ++c;
        continue;
      }
      swap(a[r], a[i]);
    }
    for (int i = 1; i <= N; ++i) {
      if (i == r) continue;
      double k = a[i][c] / a[r][c];
      for (int j = 1; j <= M + 1; ++j)
        a[i][j] -= k * a[r][j];
    }
    row[c++] = r++;
  }

  if (c > M)
    for (; r <= N; ++r)
      if (!Zero(a[r][M + 1])) {
        fout << "Imposibil\n";
        return 0;
      }

  fout << setprecision(10) << fixed;
  for (int i = 1; i <= M; ++i)
    fout << (row[i] ? (a[row[i]][M + 1] / a[row[i]][i]) : 0.0) << " ";
  fout << "\n";
  return 0;
}