#include #include #include char radek[10020]; char vystup[10002000]; long long reg[11], puv; int prevod[] = { ['I'] = 1, ['V'] = 5, ['X'] = 10, ['L'] = 50, ['C'] = 100, ['D'] = 500, ['M'] = 1000, ['I' + 100*'V'] = 4, ['I' + 100*'X'] = 9, ['X' + 100*'L'] = 40, ['X' + 100*'C'] = 90, ['C' + 100*'D'] = 400, ['C' + 100*'M'] = 900 }; void reset(){ int i; for(i = 0; i < 11; i++ ) reg[i] = -1; } long long parse(char *start, int op){ long long ret = 0; char *end; int regnum; /*printf("parsing %s\n", start);-*/ if( start[0] == 0 ) { return 0; } else if(start[0] == 'O') { return parse(start + 1, 1); } else if( start[1] && prevod[ start[0] + start[1] * 100 ] ){ return op * prevod[ start[0] + start[1] * 100 ] + parse( start+2, op); } else if ( prevod[ start[0] ] ) { return op * prevod[ start[0] ] + parse( start + 1, op); } else if ( start[0] == '+' ){ return op*parse( start + 1, +1 ); } else if ( start[0] == '-' ){ return op*parse( start + 1, -1 ); } else { regnum = strtol(start, &end, 10); /* printf("ctu %d\n", regnum);*/ if( reg[ regnum ] == -1 ) return -200000000; return op*reg[ regnum ] + parse(end, +1); } } void vypis(int regnum){ char *pis = vystup; long long cislo = reg[regnum]; if( cislo == 0 ){ printf("%d=O\n", regnum); return; } if( cislo > 10000 ){ reg[ regnum ] = puv; printf("Error\n"); return; } while( cislo >= 1000 ){ *(pis++) = 'M'; cislo -= 1000; } while( cislo >= 900 ){ *(pis++) = 'C'; *(pis++) = 'M'; cislo -= 900; } while( cislo >= 500 ){ *(pis++) = 'D'; cislo -= 500; } while( cislo >= 400 ){ *(pis++) = 'C'; *(pis++) = 'D'; cislo -= 400; } while( cislo >= 100 ){ *(pis++) = 'C'; cislo -= 100; } while( cislo >= 90 ){ *(pis++) = 'X'; *(pis++) = 'C'; cislo -= 90; } while( cislo >= 50 ){ *(pis++) = 'L'; cislo -= 50; } while( cislo >= 40 ){ *(pis++) = 'X'; *(pis++) = 'L'; cislo -= 40; } while( cislo >= 10 ){ *(pis++) = 'X'; cislo -= 10; } while( cislo >= 9 ){ *(pis++) = 'I'; *(pis++) = 'X'; cislo -= 9; } while( cislo >= 5 ){ *(pis++) = 'V'; cislo -= 5; } while( cislo >= 4 ){ *(pis++) = 'I'; *(pis++) = 'V'; cislo -= 4; } while( cislo >= 1 ){ *(pis++) = 'I'; cislo -= 1; } *pis=0; if( pis - vystup > 10000 ){ reg[ regnum ] = puv; printf("Error\n"); } else printf("%d=%s\n", regnum, vystup); } int main(){ int regnum; long long vys; char *start; reset(); while(1){ gets(radek); switch(radek[0]){ case 'R': reset(); printf("Ready\n"); break; case 'Q': printf("Bye\n"); return 0; default: regnum = strtol(radek, &start, 10); vys = parse(start+1, +1); if( vys >= 0 ){ puv = reg[ regnum ]; reg[ regnum ] = vys; /*printf("%d %lld\n", regnum, vys);*/ vypis(regnum); } else { printf("Error\n"); } } } }