#include #include #include #include #define APPEND(c,str) (*((str)++)) = (c); void val(int *num, int chrval, char chr, char **str) { int n = *num; while(n >= chrval) { APPEND(chr, *str); n -= chrval; *num = n; } *num = n; } void check(int *num, int chrval, char chr1, char chr2, char **str) { if (*num >= chrval) { *num -= chrval; APPEND(chr1, *str); APPEND(chr2, *str); } } void to_roman(int num, char *str) { val(&num, 1000, 'M', &str); check(&num, 900, 'C', 'M', &str); val(&num, 500, 'D', &str); check(&num, 400, 'C', 'D', &str); val(&num, 100, 'C', &str); check(&num, 90, 'X', 'C', &str); val(&num, 50, 'L', &str); check(&num, 40, 'X', 'L', &str); val(&num, 10, 'X', &str); check(&num, 9, 'I', 'X', &str); val(&num, 5, 'V', &str); check(&num, 4, 'I', 'V', &str); val(&num, 1, 'I', &str); *str = 0; } int valofchar(char c) { switch(c) { case 'I' : return 1; case 'V' : return 5; case 'X' : return 10; case 'L' : return 50; case 'C' : return 100; case 'D' : return 500; case 'M' : return 1000; } return 0; } int to_a(char *str) { int l = strlen(str); int t; int last = 0; int sum = 0; for(t=l-1;t>=0;--t) { int v = valofchar(str[t]); if (last > v) sum -= v; else sum += v; last = v; } return sum; } int reg[10]; void reset() { int t; for (t=0;t<10;t++) { reg[t] = -1; } } int err; int token(char **str) { char first = **str; int plus = 1; if (first == '+') { (*str)++; first = **str; } if (first == '-') { plus = 0; (*str) ++; first = **str; } if (isdigit(first)) { (*str) ++; int r = reg[first - '0']; if (r == -1) { err = 1; return 0; } return plus?r:-r; } char tmp[50000]; int pos = 0; while(isalpha(**str)) { tmp[pos++] = **str; (*str)++; } tmp[pos] = 0; int vv = to_a(tmp); return plus?vv:-vv; } int main() { reset(); char line[50000]; for(;;) { err = 0; fgets(line, 50000, stdin); if (line[0] == 'Q') { printf("Bye\n"); return 0; } if (line[0] == 'R') { reset(); printf("Ready\n"); continue; } int r = line[0] - '0'; char *str = line + 2; int sum = 0; while( *str != '\n') { sum += token(&str); if (err) break; } if (err || sum < 0 || sum > 10000) { printf("Error\n"); continue; } char tmp[50000]; to_roman(sum, tmp); printf("%c=%s\n",line[0], tmp); reg[r] = sum; } }