Cod sursa(job #1582842)

Utilizator hrazvanHarsan Razvan hrazvan Data 28 ianuarie 2016 15:54:04
Problema Algoritmul lui Gauss Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.58 kb
#include <stdio.h>
#define MAXN 300
#define MAXM 300
#define EPS 0.001
double a[MAXN][MAXM + 1], ca[MAXN][MAXM + 1], nr[MAXM];
int poz[MAXN];

inline int cmp(double x, double y){
  if(x - y > EPS)
    return 1;
  if(y - x > EPS)
    return -1;
  return 0;
}

int main(){
  FILE *in = fopen("gauss.in", "r");
  int n, m, i, j, k, l;
  double aux;
  fscanf(in, "%d%d", &n, &m);
  for(i = 0; i < n; i++){
    for(j = 0; j <= m; j++){
      fscanf(in, "%lf", &a[i][j]);
      ca[i][j] = a[i][j];
    }
  }
  fclose(in);
  for(i = 0, j = 0; i < n && j < m; i++, j++){
    poz[i] = j;
    k = i;
    while(k < n && cmp(a[k][j], 0) == 0){
      k++;
    }
    if(k == n)
      i--;
    else{
      for(l = 0; l <= m; l++){
        aux = a[i][l];  a[i][l] = a[k][l];  a[k][l] = aux;
      }
      for(l = j + 1; l <= m; l++)
        a[i][l] /= a[i][j];
      a[i][j] = 1;
      for(k = i + 1; k < n; k++){
        for(l = j + 1; l <= m; l++){
          a[k][l] -= a[i][l] * a[k][j];
        }
        a[k][j] = 0;
      }
    }
  }
  for(i = n - 1, j = 0; i >= 0; i--){
    for(j = m - 1; j > poz[i]; j--)
      a[i][m] -= nr[j] * a[i][j];
    nr[j] = a[i][m] / a[i][j];
  }
  char bun = 1;
  double sum;
  for(i = 0; i < n && bun; i++){
    sum = 0;
    for(j = 0; j < m; j++){
      sum += nr[j] * ca[i][j];
    }
    if(cmp(sum, ca[i][m]) != 0)
      bun = 0;
  }
  FILE *out = fopen("gauss.out", "w");
  if(!bun)
    fprintf(out, "Imposibil");
  else{
    for(i = 0; i < m; i++)
      fprintf(out, "%.8lf ", nr[i]);
  }
  fclose(out);
  return 0;
}