[ create a new paste ] login | about

Link: http://codepad.org/KMpvSiD1    [ raw code | output | fork ]

C, pasted on Jul 22:
#include <stdio.h>
#include <stdlib.h>

#define LIMIT 32767

#define MAKEFRACTION(num, denom) ((num) + LIMIT / 2 + LIMIT * ((denom) + LIMIT / 2))
#define NUM(n) (((n) % LIMIT) - LIMIT / 2)
#define DENOM(n) ((n) / LIMIT - LIMIT / 2)

int gcd(int a, int b) {
  if (b == 0)
    return a;
  return gcd(b, a % b);
}

int calc(int *x, char *op, int mode) {
  int g, a, b;
  while (*op != '=') {
    if (mode == 0) {
      /* *(x + 1) = *(x + 1) + (*x); */
      a = NUM(*(x + 1)) * DENOM(*x) + DENOM(*(x + 1)) * NUM(*x);
      b = DENOM(*(x + 1)) * DENOM(*x);
      g = gcd(a, b);
      *(x + 1) = MAKEFRACTION(a / g, b / g);
      x++;
      op++;
    } else if (mode == 1) {
      switch (*op) { 
      case '*':
        /* *(x + 1) = (*x) * (*(x + 1)); */
        a = NUM(*x) * NUM(*(x + 1));
        b = DENOM(*x) * DENOM(*(x + 1));
        g = gcd(a, b);
        *(x + 1) = MAKEFRACTION(a / g, b / g);
        *x = MAKEFRACTION(0, 1);
        break;
      case '/':
        /* *(x + 1) = *x / *(x + 1); */
        a = NUM(*x) * DENOM(*(x + 1));
        b = DENOM(*x) * NUM(*(x + 1));
        g = gcd(a, b);
        *(x + 1) = MAKEFRACTION(a / g, b / g);
        *x = MAKEFRACTION(0, 1);
        break;
      case '-':
        /* *(x + 1) = *(x + 1) * (-1); */
        a = NUM(*(x + 1));
        b = DENOM(*(x + 1));
        *(x + 1) = MAKEFRACTION(-a, b);
        break;
      }
      x++;
      op++;
    }
  }
  return *x;
}

#define N 10
int main() {
  int x[N];
  char op[N];
  int i, n, a, b;
  while (1) {
    printf("eval: ");
    for (i = 0; i<10; i++) {
      scanf("%d %c", &a, op + i);
      *(x + i) = MAKEFRACTION(a, 1);
      if (*(op + i) == '=')
        break;
    }
    calc(x, op, 1);
    n = calc(x, op, 0);
    a = NUM(n);
    b = DENOM(n);
    if ((a < 0) ^ (b < 0)) {
      a = -abs(a);
      b = abs(b);
    }
    if (b == 1)
      printf("%d\n", a);
    else
      printf("%d/%d\n", a, b);
  }
  return 0;
}
/* end */


Output:
1
Segmentation fault


Create a new paste based on this one


Comments: