#include #include const char* InputFile = "roman.in"; const char* OutputFile = "roman.out"; const int MaxRoman = 1024; int value(char symbol) { switch(symbol) { 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 0; } void RomanToInt(char* roman, int& num) { num = 0; while(*roman) { if(value(roman[0]) >= value(roman[1])) { num += value(roman[0]); } else { num -= value(roman[0]); } roman++; } } void IntToRoman(char* roman, int num) { struct { int s1, s2; int div; } Table[4] = { { 'M', 0 , 1000 }, { 'C', 'D', 100 }, { 'X', 'L', 10}, { 'I', 'V', 1 }, }; int i, j; for(i=0; i<4; i++) { j = num / Table[i].div; num %= Table[i].div; switch(j) { case 0: break; case 4: *roman++ = Table[i].s1; *roman++ = Table[i].s2; break; case 9: *roman++ = Table[i].s1; *roman++ = Table[i-1].s1; break; case 3: *roman++ = Table[i].s1; case 2: *roman++ = Table[i].s1; case 1: *roman++ = Table[i].s1; break; default: *roman++ = Table[i].s2; for(j-=5; j>0; j--) { *roman++ = Table[i].s1; } } } *roman = 0; } void main() { fstream fin, fout; char r1[MaxRoman], r2[MaxRoman]; int n1, n2; fin.open(InputFile, ios::in); fout.open(OutputFile, ios::out); while(fin.good() && fout.good()) { fin >> r1; if(r1[0] == '#' || !fin.good()) { break; } fin >> r2; RomanToInt(r1, n1); RomanToInt(r2, n2); n1 -= n2; if(n1 == 0) { fout << "ZERO" << endl; } else { if(n1 < 0) { n1 = -n1; } IntToRoman(r1, n1); fout << r1 << endl; } } }