Cod sursa(job #1161058)

Utilizator toranagahVlad Badelita toranagah Data 30 martie 2014 23:16:51
Problema Algoritmul lui Gauss Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <cmath>
#include <algorithm>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <vector>
using namespace std;

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

const int MAX_N = 310;
const int EPS = 1e-11;

int N, M;
double A[MAX_N][MAX_N];
double x[MAX_N];

void read_in();
void gauss();
void get_solution();

int main() {
  read_in();
  gauss();
  get_solution();
  return 0;
}

void read_in() {
  fin >> N >> M;
  for (int i = 1; i <= N; i += 1) {
    for (int j = 1; j <= M + 1; j += 1) {
      fin >> A[i][j];
    }
  }
}

void gauss() {
  for (int i = 1, j = 1, k, l; i <= N && j <= M; i += 1, j += 1) {
    for (k = i; k <= N && abs(A[k][j]) < EPS; k += 1);
    if (k > N) {
      j += 1;
      continue;
    }

    if (k != i)
      for (l = 1; l <= M + 1; l += 1)
        swap(A[i][l], A[k][l]);

    for (l = j + 1; l <= M + 1; l += 1)
      A[i][l] /= A[i][j];
    A[i][j] = 1;

    for (k = i + 1; k <= N; k += 1) {
      for (l = j + 1; l <= M + 1; l += 1) {
        A[k][l] -= A[i][l] * A[k][j];
      }
      A[k][j] = 0;
    }
  }
}

void get_solution() {
  for (int i = N; i > 0; i -= 1) {
    for (int j = i; j <= M + 1; j += 1) {
      if (j == M + 1) {
        fout << "Imposibil";
        return;
      }
      if (abs(A[i][j]) > EPS) {
        x[j] = A[i][M + 1];
        for (int k = j + 1; k <= M; k += 1)
          x[j] -= x[k] * A[i][k];
        break;
      }
    }
  }

  fout << setprecision(11) << fixed;
  for (int i = 1; i <= M; i += 1)
    fout << x[i] << ' ';
}