Cod sursa(job #1264700)

Utilizator mika17Mihai Alex Ionescu mika17 Data 16 noiembrie 2014 00:56:54
Problema Algoritmul lui Gauss Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <fstream>
#include <cmath>
#include <cstring>
#include <iomanip>
typedef double ld;

const ld EPS = 1e-10;

bool eq(ld a, ld b) {
  return fabs(a - b) < EPS; // || fabs(a - b) < fabs(a) * EPS || fabs(a - b) < fabs(b) * EPS;
}

int main() {

  std::ifstream f("gauss.in",std::ios::in);
  std::ofstream g("gauss.out",std::ios::out);

  int n,m;
  f >> n >> m;

  const int SIZ = 300;
  ld A[SIZ + 1][SIZ + 2];
  memset(A,0,sizeof A);

  for(int i = 0; i < n ; i++)
    for(int j = 0; j < m + 1; j++)
      f >> A[i][j];

  for(int i = 0, j = 0; i < n && j < m;) {
    
    if(eq(A[i][j],0.0)) {
      
      for(int t = i + 1; t < n;t++) {
        if(!eq(A[t][j],0.0)) {
          for(int k = 0; k < m + 1; k ++) {
            ld tmp = A[t][k];
            A[t][k] = A[i][k];
            A[i][k] = tmp;
          }
          break;
        }
      }
    }

    if(!eq(A[i][j],0.0)) {
      
      for(int t = i + 1; t < n; t++) {
        for(int k = j + 1; k < m + 1;k ++) {
          
          A[t][k] -= A[t][j] * A[i][k] / A[i][j];
        }
        A[t][j] = 0.0;
      }

      for(int k = j + 1; k < m + 1;k ++) {
        A[i][k] /= A[i][j];
      }

      A[i][j] = 1.0;

      i++; j++;
    }
    else {

      j++;
    }

  }

  ld x[SIZ];
  memset(x,0, sizeof x);

  g << std::fixed << std::setprecision(8);

  for(int i = n - 1; i >= 0; i -- ) {
    int j = 0;
    for(;j <= m && eq(A[i][j],0); j++);
    if(j == m) {
      g << "Imposibil" << std::endl;
      return 0;
    }

    if(j < m) {
      x[j] = A[i][m];
      for(int k = j + 1; k < m; k++) {
        x[j] -= A[i][k] * x[k];
      }
    }
  }

  for(int i = 0; i < m;i++) {
    g << x[i] << ' ';
  }
  g << std::endl;
  
  return 0;
}