#include #include #include #include using namespace std; int regs[10]; void reset() { for (int i=0;i<10;i++) regs[i]=-1; } char *nacti(char *str, int &h) { if ((!*str) || *str=='\n') return NULL; if (isdigit(*str)) {h=-(*str-'0'+1); return str+1; } int last=100000; h=0; for(;;) { int val; switch (*str) { case 'I': val=1; break; case 'V': val=5; break; case 'X': val=10; break; case 'L': val=50; break; case 'C': val=100; break; case 'D': val=500; break; case 'M': val=1000; break; case '0': val=0; break; default: return str; } if (last >= val) h+=val; else h=h-last+val-last; last=val; str++; } return str; } void vypis(int v) { if (v==0) {putchar('O'); return;} while (v>=1000) {putchar('M'); v-=1000;} if (v>=900) {printf("CM"); v-=900;} if (v>=500) {printf("D"); v-=500;} if (v>=400) {printf("CD"); v-=400;} while (v>=100) {printf("C"); v-=100;} if (v>=90) {printf("XC"); v-=90;} if (v>=50) {printf("L"); v-=50;} if (v>=40) {printf("XL"); v-=40;} while (v>=10) {printf("X"); v-=10;} if (v>=9) {printf("IX"); v-=9;} if (v>=5) {printf("V"); v-=5;} if (v>=4) {printf("IV"); v-=4;} while (v>0) {printf("I"); v--;} } int eval(char *str) { int res=0; int h; int mult=1; while (str=nacti(str, h)) { if (h<0) { if (regs[h*(-1)-1] < 0) return -1; h=regs[h*(-1)-1]; } res+=h*mult; if (*str && *str=='+') mult=1; else mult=-1; if (*str) str++; } return res; } int main(void) { char line[100000]; reset(); while (gets(line), strncmp(line, "QUIT", 4)) { if (!strncmp(line, "RESET", 5)) { puts("Ready"); reset(); continue; } char *expr=strchr(line, '='); *expr='\0'; expr++; int h=eval(expr); if (h<0 || h>10000) puts("Error"); else { int reg=atoi(line); regs[reg]=h; printf("%d=", reg); vypis(h); puts(""); } } puts("Bye"); return 0; }