#include <stdio.h>
#include <math.h>
#include <string.h>
double nextval() {
static double val;
scanf("%lf", &val);
return val;
}
char nextop() {
static char op[2] = "";
if(scanf("%1s", op) < 1) // 입력의 끝?
return '\0';
return *op; // 연산자 리턴
}
double do_calculate(double val1, char op, double val2) {
switch(op) {
case '+':
return val1 + val2;
case '-':
return val1 - val2;
case '*':
return val1 * val2;
case '/':
return val1 / val2;
case '^':
return pow(val1, val2);
case '<':
return (double)((int)val1 * (1 << (int)val2));
case '>':
return (double)((int)val1 / (1 << (int)val2));
case '&':
return (double)((int)val1 & (int)val2);
case '|':
return (double)((int)val1 | (int)val2);
}
}
int check_later_is_prior(char op_first, char op_later) {
const char *order = "^*+<&|";
if(op_first == '-') op_first = '+';
else if(op_first == '/') op_first = '*';
else if(op_first == '>') op_first = '<';
if(op_later == '-') op_later = '+';
else if(op_later == '/') op_later = '*';
else if(op_later == '>') op_later = '<';
return strchr(order, op_later) < strchr(order, op_first);
}
double calculate(double val1, double op, double val2, char op2) {
if(op2 == '\0') { // 연산이 더 없는 경우
return do_calculate(val1, op, val2);
} else {
double nval = nextval();
char nop = nextop();
if(check_later_is_prior(op, op2)) // 뒤의 연산을 더 먼저 해야하는 경우
return do_calculate(val1, op, calculate(val2, op2, nval, nop));
else
return calculate(do_calculate(val1, op, val2), op2, nval, nop);
}
}
int main() {
double val1 = nextval();
char op1 = nextop();
double val2 = nextval();
char op2 = nextop();
printf("Result: %g\n", calculate(val1, op1, val2, op2));
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtYXRoLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCmRvdWJsZSBuZXh0dmFsKCkgewoJc3RhdGljIGRvdWJsZSB2YWw7CglzY2FuZigiJWxmIiwgJnZhbCk7CglyZXR1cm4gdmFsOwp9CgpjaGFyIG5leHRvcCgpIHsKCXN0YXRpYyBjaGFyIG9wWzJdID0gIiI7CglpZihzY2FuZigiJTFzIiwgb3ApIDwgMSkgLy8g7J6F66Cl7J2YIOuBnT8KCQlyZXR1cm4gJ1wwJzsKCXJldHVybiAqb3A7IC8vIOyXsOyCsOyekCDrpqzthLQKfQoKZG91YmxlIGRvX2NhbGN1bGF0ZShkb3VibGUgdmFsMSwgY2hhciBvcCwgZG91YmxlIHZhbDIpIHsKCXN3aXRjaChvcCkgewoJCWNhc2UgJysnOgoJCQlyZXR1cm4gdmFsMSArIHZhbDI7CgkJY2FzZSAnLSc6CgkJCXJldHVybiB2YWwxIC0gdmFsMjsKCQljYXNlICcqJzoKCQkJcmV0dXJuIHZhbDEgKiB2YWwyOwoJCWNhc2UgJy8nOgoJCQlyZXR1cm4gdmFsMSAvIHZhbDI7CgkJY2FzZSAnXic6CgkJCXJldHVybiBwb3codmFsMSwgdmFsMik7CgkJY2FzZSAnPCc6CgkJCXJldHVybiAoZG91YmxlKSgoaW50KXZhbDEgKiAoMSA8PCAoaW50KXZhbDIpKTsKCQljYXNlICc+JzoKCQkJcmV0dXJuIChkb3VibGUpKChpbnQpdmFsMSAvICgxIDw8IChpbnQpdmFsMikpOwoJCWNhc2UgJyYnOgoJCQlyZXR1cm4gKGRvdWJsZSkoKGludCl2YWwxICYgKGludCl2YWwyKTsKCQljYXNlICd8JzoKCQkJcmV0dXJuIChkb3VibGUpKChpbnQpdmFsMSB8IChpbnQpdmFsMik7Cgl9Cn0KCmludCBjaGVja19sYXRlcl9pc19wcmlvcihjaGFyIG9wX2ZpcnN0LCBjaGFyIG9wX2xhdGVyKSB7Cgljb25zdCBjaGFyICpvcmRlciA9ICJeKis8JnwiOwoJCglpZihvcF9maXJzdCA9PSAnLScpIG9wX2ZpcnN0ID0gJysnOwoJZWxzZSBpZihvcF9maXJzdCA9PSAnLycpIG9wX2ZpcnN0ID0gJyonOwoJZWxzZSBpZihvcF9maXJzdCA9PSAnPicpIG9wX2ZpcnN0ID0gJzwnOwoJCglpZihvcF9sYXRlciA9PSAnLScpIG9wX2xhdGVyID0gJysnOwoJZWxzZSBpZihvcF9sYXRlciA9PSAnLycpIG9wX2xhdGVyID0gJyonOwoJZWxzZSBpZihvcF9sYXRlciA9PSAnPicpIG9wX2xhdGVyID0gJzwnOwoJCglyZXR1cm4gc3RyY2hyKG9yZGVyLCBvcF9sYXRlcikgPCBzdHJjaHIob3JkZXIsIG9wX2ZpcnN0KTsKfQoKZG91YmxlIGNhbGN1bGF0ZShkb3VibGUgdmFsMSwgZG91YmxlIG9wLCBkb3VibGUgdmFsMiwgY2hhciBvcDIpIHsKCWlmKG9wMiA9PSAnXDAnKSB7IC8vIOyXsOyCsOydtCDrjZQg7JeG64qUIOqyveyasAoJCXJldHVybiBkb19jYWxjdWxhdGUodmFsMSwgb3AsIHZhbDIpOwoJfSBlbHNlIHsKCQlkb3VibGUgbnZhbCA9IG5leHR2YWwoKTsKCQljaGFyIG5vcCA9IG5leHRvcCgpOwoJCQoJCWlmKGNoZWNrX2xhdGVyX2lzX3ByaW9yKG9wLCBvcDIpKSAvLyDrkqTsnZgg7Jew7IKw7J2EIOuNlCDrqLzsoIAg7ZW07JW87ZWY64qUIOqyveyasAoJCQlyZXR1cm4gZG9fY2FsY3VsYXRlKHZhbDEsIG9wLCBjYWxjdWxhdGUodmFsMiwgb3AyLCBudmFsLCBub3ApKTsKCQllbHNlCgkJCXJldHVybiBjYWxjdWxhdGUoZG9fY2FsY3VsYXRlKHZhbDEsIG9wLCB2YWwyKSwgb3AyLCBudmFsLCBub3ApOwoJfQp9CgppbnQgbWFpbigpIHsKCWRvdWJsZSB2YWwxID0gbmV4dHZhbCgpOwoJY2hhciBvcDEgPSBuZXh0b3AoKTsKCWRvdWJsZSB2YWwyID0gbmV4dHZhbCgpOwoJY2hhciBvcDIgPSBuZXh0b3AoKTsKCXByaW50ZigiUmVzdWx0OiAlZ1xuIiwgY2FsY3VsYXRlKHZhbDEsIG9wMSwgdmFsMiwgb3AyKSk7CglyZXR1cm4gMDsKfQ==