导航
导航
文章目录
  1. 题目
  2. 翻译

LeetCode-12.Integer to Roman

题目

Given an integer, convert it to a roman numeral.

Input is guaranteed to be within the range from 1 to 3999.

翻译

给出一个整数,将其转换为罗马数字。
输入范围为1到3999。

本题需要先弄明白罗马数字的表示规律:
罗马数字采用七个罗马字母作数字、即Ⅰ(1)、X(10)、C(100)、M(1000)、V(5)、L(50)、D(500)。
记数的方法:
(1) 相同的数字连写,所表示的数等于这些数字相加得到的数,如 Ⅲ=3;
(2) 小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数,如 Ⅷ=8、Ⅻ=12;
(3) 小的数字(限于 Ⅰ、X 和 C)在大的数字的左边,所表示的数等于大数减小数得到的数,如 Ⅳ=4、Ⅸ=9;
(4) 在一个数的上面画一条横线,表示这个数增值 1,000 倍。
例如:Ⅲ=3、Ⅳ=4、Ⅵ=6、XIX=19、XX=20、XLV=45、MCMLXXX=1980。

总结可知,罗马数字可以逐位计算,而每个阿拉伯数字由一位或两位罗马数字组成。
因为题中说明数字不超过3999,所以可以采用列举的办法,从M开始,分别用M、CM、D、CD、C、XC、L、XL、X、IX、V、IV、I,表示1000、900、500、400、100、90、50、40、10、9、5、4、1,逐个从阿拉伯数字中减去,拼接字符串:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Solution {
public String intToRoman(int num) {
String intString = "";
String[] romanNum = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
int[] integers = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
for (int i = 0; i < romanNum.length; i++) {
while (num > integers[i]) {
num -= integers[i];
intString += romanNum[i];
}
}
return intString;
}
}

参考:
http://baike.baidu.com/link?url=slAoUSP15GV-2m_cctYO8-lzUECMQiWBKMumDSFfYgYzIGc50jXAQuCR4TFd80NyMT3alfEuBG6V3o1MQICJ4K
http://blog.csdn.net/havenoidea/article/details/11848921