题目
思路
对于千位以上的部分,每个M
表示1千;
千位以下,百位以上的部分,CM
表示900
,D
表示500,CD
表示400,C
表示100;
百位以下,十位以上的部分, XC
表示90
,L
表示50
,XL
表示40
,X
表示10;
十位以下的部分, IX
表示9
,V
表示5
,IV
表示4
,I
表示1
。
可以看到,数字会优先使用最大的表示单位进行表示,不足够使用大单位表示的数字才使用小单位表示(即100不会用100个最小的单位I
来进行表示,而是使用尽量大的单位C
来进行表示),因此,我们从上述最大的表示单位开始选用,每选择一个表示单位就从原整数中减去对应的数额(例如,选择CM
就减去900
),即可得到整数转换为罗马数字的结果。
代码
class Solution {
public:
string intToRoman(int num) {
string result;
// 从千位之上的部分开始
int base = 1000;
char* map[4][4] = {
{" ", " ", " ", "M"}, // 千位对应罗马数字
{"CM", "D", "CD", "C"}, // 百位对应罗马数字
{"XC", "L", "XL", "X"}, // 十位对应的罗马数字
{"IX", "V", "IV", "I"} // 各位对应的罗马数字
};
for (int i = 0; i < 4; i++) {
while (num >= base) {
if (num >= 9 * base ) {
result += map[i][0];
num -= 9 * base;
} else if (num >= 5 * base) {
result += map[i][1];
num -= 5 * base;
} else if (num >= 4 *base) {
result += map[i][2];
num -= 4 * base;
} else {
result += map[i][3];
num -= base;
}
}
// 处理更低位的数字
base /= 10;
}
return result;
}
};