#include #include #define isrom(x) (x >= 'A' && x <= 'Z' ? 1 : 0) int reg[20], i, j; char rt[10010], s[10105]; bool er; int toint( char c) { switch (c) { case 'O' : return 0; 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 -1; } char tochar( int x) { switch (x) { case 0: return 'O'; case 1: return 'I'; case 5: return 'V'; case 10: return 'X'; case 50: return 'L'; case 100: return 'C'; case 500: return 'D'; case 1000: return 'M'; } return 0; } char * str ( int x ) { int pom[100], sz = 0; memset(pom, 0, sizeof pom); pom[0] = x / 1000; x %= 1000; if (x >= 900) pom[1] = 1, x -= 900; pom[2] = x / 500; x %= 500; if (x >= 400) pom[3] = 1, x -= 400; pom[4] = x / 100; x %= 100; if (x >= 90) pom[5] = 1, x -= 90; pom[6] = x / 50; x %= 50; if (x >= 40) pom[7] = 1, x -= 40; pom[8] = x / 10; x %= 10; if (x >= 9) pom[9] = 1, x -= 9; pom[10] = x / 5; x %= 5; if (x >= 4) pom[11] = 1, x -= 4; pom[12] = x; for (i = 0; i <= 12; i++) { switch (i) { case 0: while (pom[i]) { rt[sz++] = 'M'; pom[i]--;} break; case 1: while (pom[i]) { rt[sz++] = 'C';rt[sz++] = 'M'; pom[i]--;} break; case 2: while (pom[i]) { rt[sz++] = 'D'; pom[i]--;} break; case 3: while (pom[i]) { rt[sz++] = 'C';rt[sz++] = 'D'; pom[i]--;} break; case 4: while (pom[i]) { rt[sz++] = 'C'; pom[i]--;} break; case 5: while (pom[i]) { rt[sz++] = 'X';rt[sz++] = 'C'; pom[i]--;} break; case 6: while (pom[i]) { rt[sz++] = 'L'; pom[i]--;} break; case 7: while (pom[i]) { rt[sz++] = 'X';rt[sz++] = 'L'; pom[i]--;} break; case 8: while (pom[i]) { rt[sz++] = 'X'; pom[i]--;} break; case 9: while (pom[i]) { rt[sz++] = 'I';rt[sz++] = 'X'; pom[i]--;} break; case 10: while (pom[i]) { rt[sz++] = 'V'; pom[i]--;} break; case 11: while (pom[i]) { rt[sz++] = 'I';rt[sz++] = 'V'; pom[i]--; } break; case 12: while (pom[i]) { rt[sz++] = 'I'; pom[i]--; } break; } } rt[sz] = '\0'; return rt; } int val(char * s) { int ret[1000]; for (i = 0; i < (int)strlen(s); i++) ret[i] = toint(s[i]); int x = 0; for (i = 0; i < strlen(s); i++) if ((i +1) < strlen(s) && ret[i] < ret[i+1]) x += ret[i+1] - ret[i++]; else x += ret[i]; return x; } int calc (char * s) { int pom; char ss[1000]; if (er) return 0; if (strlen(s) == 0) return 0; if (isdigit(s[0])) { if (s[0] < '0' || reg[s[0]-'0'] == -1) { er = 1; return -1;} if (strlen(s) ==1) { return reg[s[0]-'0'];} pom = reg[s[0]-'0']; ss[0]=s[0], ss[1] = '\0'; } else { int zac = 0; while (zac < strlen(s) && isrom(s[zac])) ss[zac] = s[zac++]; ss[zac] = '\0'; pom = val(ss); if (zac >= strlen(s) -1) return pom; } int x = calc (s + strlen(ss)+1); if (s[strlen(ss)] == '+') return pom + x; else return pom - x; } int main() { memset(reg, -1, sizeof reg); while (1) { int r = getchar(); er = 0; if (r == 'Q') { puts ("Bye"); break; } else if (r == 'R') { getchar(), getchar(), getchar(), getchar(), getchar(); puts ("Ready"); memset(reg, -1, sizeof reg); continue; } r -= '0'; getchar(); int c; j = 0; while ((c = getchar()) != '\n') s[j++] = c; s[j] = '\0'; //puts(s); int ret = calc(s); //printf ("R %d\n", ret); if (ret < 0 || ret > 10000 || er) { puts("Error"); continue; } reg[r] = ret; printf ("%d=%s\n", r, str(ret)); } return 0; }