12. 整数转罗马数字
这道题是将十进制的整数转换成罗马数字表示,由于罗马字母的限制,只能转换1到3999之间的数。根据题目描述以及示例,可以发现转换原理很简单,就是将十进制对应位上的数字转换成罗马对应的字母就可以了,对应关系如下:
字符 | 数值 |
---|---|
I | 1 |
V | 5 |
X | 10 |
L | 50 |
C | 100 |
D | 500 |
M | 1000 |
例如转换234为罗马数字,拆解每一位的值,找到对应的字符即可,234分解为:
200 “CC”
30 “XXX”
4 “IV”
234对应的罗马表示为:“CCXXXIV”
因此,这个算法只需要把输入的十进制整数拆解成
n
×
10
m
n \times \mathbf{10}^m
n×10m
再转换成对应的罗马字母表示,最后将他们合并就是最终的转换结果。
下面是C++版的实现:
class Solution {
public:
void appendValue(std::string& strRoman, int roman){
if(roman < 4)
strRoman.append(roman, 'I');
else if(roman == 4)
strRoman.append("IV");
else if(roman == 5)
strRoman.append(1, 'V');
else if(roman < 9)
strRoman.append(1, 'V').append(roman - 5, 'I');
else if(roman == 9)
strRoman.append("IX");
else if(roman < 40)
strRoman.append(roman / 10, 'X');
else if(roman == 40)
strRoman.append("XL");
else if(roman == 50)
strRoman.append(1, 'L');
else if(roman < 90)
strRoman.append(1, 'L').append((roman - 50) / 10, 'X');
else if(roman == 90)
strRoman.append("XC");
else if(roman < 400)
strRoman.append(roman / 100, 'C');
else if(roman == 400)
strRoman.append("CD");
else if(roman == 500)
strRoman.append(1, 'D');
else if(roman < 900)
strRoman.append(1, 'D').append((roman - 500) / 100, 'C');
else if(roman == 900)
strRoman.append("CM");
else if(roman < 4000)
strRoman.append(roman / 1000, 'M');
}
string intToRoman(int num) {
std::string strRoman;
if(num > 0 && num < 4000){
int div = 1000;
while(!(num / div)) div /= 10;
int remainder = 0;
while(remainder = num % div){
int roman = num - remainder;
appendValue(strRoman, roman);
num = remainder;
div /= 10;
}
appendValue(strRoman, num);
}
return strRoman;
}
};