罗马数字包含以下七种字符:?I
,?V
,?X
,?L
,C
,D
?和?M
。
字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000
例如, 罗马数字 2 写做?II
?,即为两个并列的 1。12 写做?XII
?,即为?X
?+?II
?。 27 写做??XXVII
, 即为?XX
?+?V
?+?II
?。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做?IIII
,而是?IV
。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为?IX
。这个特殊的规则只适用于以下六种情况:
I
?可以放在?V
?(5) 和?X
?(10) 的左边,来表示 4 和 9。X
?可以放在?L
?(50) 和?C
?(100) 的左边,来表示 40 和?90。?C
?可以放在?D
?(500) 和?M
?(1000) 的左边,来表示?400 和?900。给你一个整数,将其转为罗马数字。
示例?1:
输入:?num = 3 输出: "III"
示例?2:
输入:?num = 4 输出: "IV"
示例?3:
输入:?num = 9 输出: "IX"
示例?4:
输入:?num = 58 输出: "LVIII" 解释: L = 50, V = 5, III = 3.
示例?5:
输入:?num = 1994 输出: "MCMXCIV" 解释: M = 1000, CM = 900, XC = 90, IV = 4.
提示:
1 <= num <= 3999
方法1:
public static String intToRoman(int num) {
int[] nums = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
StringBuilder stringBuilder = new StringBuilder();
while (num > 0){
for (int i = 0; i < nums.length; ) {
while (num >= nums[i]){
stringBuilder.append(toString(nums[i]));
num -= nums[i];
}
i++;
}
}
return stringBuilder.toString();
}
public static String toString(int num){
switch (num){
case 1000:
return "M";
case 900:
return "CM";
case 500:
return "D";
case 400:
return "CD";
case 100:
return "C";
case 90:
return "XC";
case 50:
return "L";
case 40:
return "XL";
case 10:
return "X";
case 9:
return "IX";
case 5:
return "V";
case 4:
return "IV";
case 1:
return "I";
}
return "";
}
方法2:
public String intToRoman(int num) {
StringBuilder sb = new StringBuilder();
int remains = num;
while (remains > 0) {
if (remains >= 1000) {
sb.append('M');
remains -= 1000;
} else if (remains >= 100) {
if (remains >= 900) {
sb.append("CM");
remains -= 900;
} else if (remains >= 500) {
sb.append('D');
remains -= 500;
} else if (remains >= 400) {
sb.append("CD");
remains -= 400;
} else {
sb.append('C');
remains -= 100;
}
} else if (remains >= 10) {
if (remains >= 90) {
sb.append("XC");
remains -= 90;
} else if (remains >= 50) {
sb.append('L');
remains -= 50;
} else if (remains >= 40) {
sb.append("XL");
remains -= 40;
} else {
sb.append('X');
remains -= 10;
}
} else {
if (remains >= 9) {
sb.append("IX");
remains -= 9;
} else if (remains >= 5) {
sb.append('V');
remains -= 5;
} else if (remains >= 4) {
sb.append("IV");
remains -= 4;
} else {
sb.append('I');
remains -= 1;
}
}
}
return sb.toString();
}
方法3:
int[] values = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
String[] symbols = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
public String intToRoman(int num) {
StringBuffer roman = new StringBuffer();
for (int i = 0; i < values.length; ++i) {
int value = values[i];
String symbol = symbols[i];
while (num >= value) {
num -= value;
roman.append(symbol);
}
if (num == 0) {
break;
}
}
return roman.toString();
}