#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 */