题目描述
Given an integer, convert it to a roman numeral.
Input is guaranteed to be within the range from 1 to 3999.
将阿拉伯数字转换为罗马数字,给你的数字范围是1之3999.解题思路
必须将罗马数字及其构造规则说明一下:
在罗马数字中, 利用7个不同字母进行重复或者组合来表达各式各样的数字.
I = 1
V = 5
X = 10
L = 50
C = 100
D = 500
M = 1000
I = 1
V = 5
X = 10
L = 50
C = 100
D = 500
M = 1000
下面是关于构造罗马数字的一些通用的规则的介绍:
1> 字符是叠加的. I表示1, II表示2, 而III表示3. VI表示6(字面上为逐字符相加, "5加1"), VII表示7, VIII表示8.
2> 能够被10整除的字符(I, X, C, 和M)至多可以重复三次. 对于4, 你则需要利用下一个最大的能够被5整除的字符进行减操作得到, 你不能把4表示成IIII; 而应表示为IV(比5小1). 数字40写成XL(比50小10), 41写成XLI, 42写成XLII, 43写成XLIII, 而44写成XLIV(比50小10, 然后比5小1).
3> 类似的, 对于数字9, 你必须利用下一个能够被10整除的字符进行减操作得到: 8表示为VIII, 而9则表示为IX(比10小1), 而不是VIIII(因为字符I不能连续重复四次). 数字90表示为XC, 900表示为CM.
4> 被5整除的字符不能重复. 数字10常表示为X, 而从来不用VV来表示. 数字100常表示为C, 也从来不表示为LL.
5> 罗马数字经常从高位到低位书写, 从左到右阅读, 因此不同顺序的字符意义大不相同. DC表示600; 而CD是一个完全不同的数字(为400, 也就是比500小100). CI表示101; 而IC甚至不是一个合法的罗马字母(因为你不能直接从数字100减去1; 比需要写成XCIX, 意思是比100小10, 然后加上数字9, 也就是比10小1的数字).
通过上述规则,我们可以得到,在可表示范围以内的数字均是由
{1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 }来组成,即罗马数字由
{"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" }来组成,得到这两个数组至关重要。接下来获取罗马数字就顺理成章了。
代码
public String intToRoman(int num) {
int[] values = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
String[] nums = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };
StringBuilder result = new StringBuilder();
for (int i = 0; i < values.length; i++) {
while (num >= values[i]) {
num -= values[i];
result.append(nums[i]);
}
}
return result.toString();
}