#include #include #include #include #include using namespace std; #define FOR(i,a,b) for (int i = (a); i < (b); ++i) int vals[300] = {0}; int to_int(const string & str) { int res = 0; FOR(i, 0, str.size()) if (i + 1 < str.size() && vals[str[i]] < vals[str[i+1]]) { res += vals[str[i+1]] - vals[str[i]]; ++i; } else res += vals[str[i]]; return res; } string to_rom(int n) { if (!n) return "0"; string out; while (n) { if (n >= 1000) { out += "M"; n -= 1000; } else if (n >= 900) { out += "CM"; n -= 900; } else if (n >= 500) { out += "D"; n -= 500; } else if (n >= 400) { out += "CD"; n -= 400; } else if (n >= 100) { out += "C"; n -= 100; } else if (n >= 90) { out += "XC"; n -= 90; } else if (n >= 50) { out += "L"; n -= 50; } else if (n >= 40) { out += "XL"; n -= 40; } else if (n >= 10) { out += "X"; n -= 10; } else if (n >= 9) { out += "IX"; n -= 9; } else if (n >= 5) { out += "V"; n -= 5; } else if (n >= 4) { out += "IV"; n -= 4; } else { out += "I"; --n; } } return out; } int reg[10]; void resetf() { FOR(i, 0, 10) reg[i] = -1; } char temp[10047]; int main() { vals['I'] = 1; vals['V'] = 5; vals['X'] = 10; vals['L'] = 50; vals['C'] = 100; vals['D'] = 500; vals['M'] = 1000; string quit("QUIT"), reset("RESET"); resetf(); while (1) { scanf("%s ", temp); if (temp == quit) { printf("Bye\n"); break; } else if (temp == reset) { resetf(); printf("Ready\n"); continue; } int r = temp[0] - '0'; int index = 2; int len = strlen(temp); int val = 0; bool res = true; while (index < len) { string str; bool plus = true; if (temp[index-1] == '-') plus = false; while (index < len && temp[index] != '+' && temp[index] != '-') str += temp[index++]; if (isdigit(str[0])) { if (reg[str[0]-'0'] == -1) { printf("Error\n"); res = false; break; } if (plus) val +=reg[str[0]-'0']; else val -= reg[str[0]-'0']; } else { if (plus) val += to_int(str); else val -= to_int(str); } ++index; } if (!res) continue; if (val < 0 || val > 10000) printf("Error\n"); else { reg[r] = val; printf("%d=%s\n", r, to_rom(val).c_str()); } } return 0; }