#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* thousands[] = { "", "M", "MM", "MMM" };
char* hundreds[] = { "", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM" };
char* tens[] = { "", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC" };
char* ones[] = { "", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX" };
int romtran(char);
int parseR(char*);
char* parseStoR(int num);
int main(int argc, char* argv[]) {
char buffer[50] = "\0";
char num0[20] = "\0";
char num1[20] = "\0";
while (1) {
if (fgets(buffer, sizeof(buffer), stdin) == NULL) {
return 0;
}
if (strcmp(buffer, "#\n") == 0) {
return 0;
}
// 使用sscanf_s
if (sscanf_s(buffer, "%19s %19s", num0, (unsigned)_countof(num0), num1, (unsigned)_countof(num1)) != 2) {
continue;
}
int romnum1, romnum2;
romnum1 = parseR(num0);
romnum2 = parseR(num1);
char* result = parseStoR(romnum1 - romnum2);
if (result != NULL) {
printf("%s\n", result);
// 釋放記憶體(除非是靜態字串)
if (strcmp(result, "ZERO") != 0 && strcmp(result, "negative") != 0) {
free(result);
}
}
}
return 0;
}
int romtran(char ch) {
switch (ch) {
case 'I':
case 'i':
return 1;
case 'V':
case 'v':
return 5;
case 'X':
case 'x':
return 10;
case 'L':
case 'l':
return 50;
case 'C':
case 'c':
return 100;
case 'D':
case 'd':
return 500;
case 'M':
case 'm':
return 1000;
default:
return 0;
}
}
int parseR(char* R) {
int total = 0;
int prev = 0;
//*****右到左解析羅馬數字*****
for (int i = strlen(R) - 1; i >= 0; i--) {
int curr = romtran(R[i]);
int sign = (curr < prev) ? -1 : 1;
total += sign * curr;
prev = curr;
}
return total;
}
char* parseStoR(int num) {
if (num == 0)
return "ZERO";
if (num < 0)
return "negative";
if (num > 3999)
return "overflow"; // 或你想要的字串
char* result = (char*)malloc(32);
if (!result) return NULL;
result[0] = '\0';
strcat_s(result, 32, thousands[num / 1000]);
strcat_s(result, 32, hundreds[(num % 1000) / 100]);
strcat_s(result, 32, tens[(num % 100) / 10]);
strcat_s(result, 32, ones[num % 10]);
return result;
}