Cod sursa(job #1479183)

Utilizator vladrochianVlad Rochian vladrochian Data 30 august 2015 17:57:07
Problema Algoritmul lui Gauss Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 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];

  for (int r = 1, c = 1; r <= N && c <= M; ++c) {
    if (Zero(a[r][c])) {
      int i = r + 1;
      while (i <= N && Zero(a[i][c]))
        ++i;
      if (i > N) 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++;
  }

  for (int i = row[M] + 1; i <= N; ++i)
    if (!Zero(a[i][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;
}