#include #include char input[10005]; int reg[10]; char *pairs[] = {"IV", "IX", "XL", "XC", "CD", "CM" }; int pairVals[] = {4, 9, 40, 90, 400, 900}; #define PAIRS 6 int rimVals[256]; #define TO_CNT 13 int toRimVals[] = {1000,900,500,400,100,90,50,40,10,9,5,4,1}; char *toRimString[] = {"M","CM","D","CD","C","XC","L","XL","X","IX", "V", "IV", "I"}; void compose(long num){ //sprintf(input, "%ld", num ); if( num == 0 ){ input[0]='O'; input[1]='\0'; return; } input[0]='\0'; for(int x=0;x='0' && input[i]<='9'){ result += pairVals[ input[i] - '0' ]; i++; } else{ result += rimVals[ (int)input[i] ]; } } //printf("%d\n", result ); input[i] = tmp; *pi = i; return result; } void parseLine(){ int destRegNum; int i=0; sscanf(input, "%d=",&destRegNum); while( input[i]!='=') i++; long lineRes=0; while( input[i]!='\0' ){ char plus = 1; if( input[i] == '-' ) plus = 0; i++; long res = 0; if( input[i]>='1' && input[i]<='9' ){ //register int regNum; if( input[i+1]=='0' ){ regNum = 10; i+=2; } else{ regNum=(int)input[i]-(int)'0'; i+=1; } if( reg[regNum-1] == -1 ){ printf("Error\n"); return; } res = reg[regNum-1]; } else{ res = decompose(&i); } if( plus ) lineRes += res; else lineRes -= res; } if( lineRes<0 || lineRes>10000 ){ printf("Error\n"); return; } // ukladam do registrov reg[destRegNum-1] = lineRes; compose(lineRes); // ulozi do input printf("%d=%s\n", destRegNum, input ); } void inline resetReg(){ for(int i=0;i<10;i++) reg[i] = -1;// not set } int main() { resetReg(); rimVals['O'] = 0; rimVals['I'] = 1; rimVals['V'] = 5; rimVals['X'] = 10; rimVals['L'] = 50; rimVals['C'] = 100; rimVals['D'] = 500; rimVals['M'] = 1000; while(1){ fgets(input,10004,stdin); if( input[0]=='Q'){ printf("Bye\n"); return 0; } if( input[0]=='R'){ resetReg(); printf("Ready\n"); continue; } parseLine(); } }