最开始想的是当成进制转,比如说 :
1 -> I, 2 -> II, 5 -> V, 6 -> VI ....
public static String intToRoman1(int num) {
String[] roman = {"I", "V", "X", "L", "C", "D", "M"};
int[] radix = { 1, 5, 10, 50, 100, 500, 1000};
StringBuffer sb = new StringBuffer();
for (int i = radix.length - 1; i >= 0; i--) {
for (int j = num / radix[i]; j > 0; j--)
sb.append(roman[i]);
num = num % radix[i];
}
return sb.toString();
}
但是这里有一个坑就是 4 对应的罗马数字不是 IIII, 而是 IV
修改后 为:
public String intToRoman(int num) {
String[] roman = {"", "", "I", "V", "X", "L", "C", "D", "M"};
int[] radix = { 0, 0, 1, 5, 10, 50, 100, 500, 1000};
StringBuffer sb = new StringBuffer();
for (int i = radix.length - 1; i >= 2 && num > 0; i--) {
if (num + radix[(i - 2) + i % 2] >= radix[i]) {
if (num >= radix[i]) {
sb.append(roman[i]);
num -= radix[i];
i++;
} else {
sb.append(roman[(i - 2) + i % 2]).append(roman[i]);
num = num + radix[(i - 2) + i % 2] - radix[i];
}
}
}
这里另一个坑就是 49 不是50 - 1 而是 (50-10)+(10-1) XLIX
通过找规律发现 :
5,10 只能减1 , 即 V,X 前面只能有一个 I,
50,100 只能减10,即 L, C 前面只能有一个X
500, 1000 只能减100,即 D,M前面只能有一个C
num + radix[(i - 2) + i % 2]
这一段代码就是对这个坑进行处理