#include #include #include int vars[10]; char s[80], *s0 = " "; int err; char *int2rom(int n) { const char map[5][10][11] = { {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"}, {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"}, {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"}, {"", "M", "MM", "MMM", "MMMM", "MMMMM", "MMMMMM", "MMMMMMM", "MMMMMMMM", "MMMMMMMMM"}, {"", "MMMMMMMMMM", "", "", "", "", "", "", "", ""} }; /*char s[80];*/ char m[100][5]; memset(s, 0, 80); if (!n) return "O"; else { int i = 0; while (n > 0) { memset(m[i], 0, 5); strcpy(m[i], map[i][n % 10]); i++; n = n / 10; } for (i--; i >= 0; i--) { strcat(s, m[i]); } } return s; } int romd2int(char *c) { const char map[5][10][11] = { {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"}, {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"}, {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"}, {"", "M", "MM", "MMM", "MMMM", "MMMMM", "MMMMMM", "MMMMMMM", "MMMMMMMM", "MMMMMMMMM"}, {"", "MMMMMMMMMM", "", "", "", "", "", "", "", ""} }; int x, y; if (strcmp(c, "O") == 0) return 0; for (y = 0; y < 5; y++) for (x = 0; x < 10; x++) { /*printf("%s:%s.\n", map[y][x], c);*/ if (strcmp(map[y][x], c) == 0) return x * pow(10, y); } return 0; } int rom2int(char *c) { int i; char c2[3]; int r, r0; r = 0; for (i = 0; i < strlen(c); i++) { r0 = r; if (i < strlen(c) - 1) { c2[2] = 0; c2[1] = c[i + 1]; c2[0] = c[i]; if (strcmp(c2, "IV") == 0) r += 4; if (strcmp(c2, "IX") == 0) r += 9; if (strcmp(c2, "XL") == 0) r += 40; if (strcmp(c2, "XC") == 0) r += 90; if (strcmp(c2, "CD") == 0) r += 400; if (strcmp(c2, "CM") == 0) r += 900; if (r != r0) i++; } if (r0 == r) { c2[1] = 0; c2[0] = c[i]; r += romd2int(c2); } } return r; } int conv(char *c) { if (c[0] >= '0' && c[0] <= '9') { if (vars[c[0] - '0'] > -1) return vars[c[0] - '0']; else { printf("Error\n"); err = 1; return 0; } } else return rom2int(c); } void qstrcpy(char *to, char *from, int n) { int i; if (n > strlen(from)) n = strlen(from); printf("n = %d, from[1] = %c\n", n, from[1]); for (i = 0; i < n; i++) { printf("ii = %d\n", i); to[i] = from[i]; } to[i] = 0; } int main() { char l[10001], op; char rr[80]; int i, j, v, opp; long long r; for (i = 0; i < 10; i++) vars[i] = -1; while (1) { scanf("%s", l); if (strcmp(l, "QUIT") == 0) { printf("Bye\n"); break; } else if (strcmp(l, "RESET") == 0) { for (i = 0; i < 10; i++) vars[i] = -1; printf("Ready\n"); } else { v = l[0] - '0'; r = -1; op = ' '; opp = 0; err = 0; for (i = 2; i < strlen(l) && !err; i++) { /*printf("i = %d\n", i);*/ if (l[i] == '+' || l[i] == '-') { if (op == ' ') { op = l[i]; opp = i; memset(rr, 0, 80); strncpy(rr, l + 2, i - 2); /*printf("rr = %s\n", rr);*/ r = conv(rr); } else { memset(rr, 0, 80); strncpy(rr, l + opp + 1, i - opp - 1); /*printf("rr = %s\n", rr);*/ if (op == '+') r += conv(rr); else r -= conv(rr); op = l[i]; opp = i; } /*printf("r = %d\n", r);*/ } } if (!err) { /*printf("err = %d\n", err);*/ if (op != ' ') { memset(rr, 0, 80); strncpy(rr, l + opp + 1, strlen(l) - opp - 1); /*printf("rr = %s\n", rr);*/ if (op == '+') r += conv(rr); else r -= conv(rr); } else { memset(rr, 0, 80); strncpy(rr, l + 2, strlen(l) - 2); r = conv(rr); } if (!err) { if (r <= 10000 && r >= 0) { vars[v] = r; printf("%d=%s\n", v, int2rom(vars[v])); } else { printf("Error\n"); } } } } } return 0; }