【题目】
Given an integer, convert it to a roman numeral.
Input is guaranteed to be within the range from 1 to 3999.
【分析】只要是遵守那个转换规则就好吧。然后就是数学处理。
【代码1】
private static LinkedHashMap<Integer, String> numToRoman = new LinkedHashMap<Integer, String>();
static {
numToRoman.put(1000, "M");
numToRoman.put(900, "CM");
numToRoman.put(500, "D");
numToRoman.put(400, "CD");
numToRoman.put(100, "C");
numToRoman.put(90, "XC");
numToRoman.put(50, "L");
numToRoman.put(40, "XL");
numToRoman.put(10, "X");
numToRoman.put(9, "IX");
numToRoman.put(5, "V");
numToRoman.put(4, "IV");
numToRoman.put(1, "I");
}
public static String intToRoman(int num) {
for (Integer i : numToRoman.keySet()) {
if (num >= i) {
return numToRoman.get(i) + intToRoman(num - i);
}
}
return "";
}
【代码2】
string intToRoman(int num) {
string M[] = {"", "M", "MM", "MMM"};
string C[] = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};
string X[] = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};
string I[] = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};
return M[num/1000] + C[(num%1000)/100] + X[(num%100)/10] + I[num%10];
}
【代码3】
动用递归
public String intToRoman(int num) {
if(num>=1000) return "M"+intToRoman(num-1000);
if(num>=900) return "CM"+intToRoman(num-900);
if(num>=500) return "D"+intToRoman(num-500);
if(num>=400) return "CD"+intToRoman(num-400);
if(num>=100) return "C"+intToRoman(num-100);
if(num>=90) return "XC"+intToRoman(num-90);
if(num>=50) return "L"+intToRoman(num-50);
if(num>=40) return "XL"+intToRoman(num-40);
if(num>=10) return "X"+intToRoman(num-10);
if(num>=9) return "IX"+intToRoman(num-9);
if(num>=5) return "V"+intToRoman(num-5);
if(num>=4) return "IV"+intToRoman(num-4);
if(num>=1) return "I"+intToRoman(num-1);
return "";
}