整數轉換成羅馬數字:
羅馬數字的基本型為:I=1,V=5,X=10,L=50,C=100,D=500,M=1000,相同的羅馬數字最多不能超過三個。所以對於4只能表示為5-1即IV,左減右加。
同理,9=IX,40=XL,90=XC,400=CD,900=CM。根據這些基本型,可以通過貪心算法,每次匹配最大值得到羅馬數字.
//整數轉化成羅馬數字 //貪心算法,每次取匹配最大值 public static String intToRoman(int number) { int[] base = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 }; String[] str = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" }; String roman = ""; int i = 0; while (number != 0) { if (number >= base[i]) { number -= base[i]; roman += str[i]; } else i++; } return roman; }
羅馬數字轉換成整數:
首先要來了解一下羅馬數字表示法,基本字符有7個:I,V,X,L,C,D,M,分別表示1,5,10,50,100,500,1000。
在構成數字的時候,有下列規則:
1、相同的數字連寫,所表示的數等於這些數字相加得到的數,如:Ⅲ = 3;
2、小的數字在大的數字的右邊,所表示的數等於這些數字相加得到的數, 如:Ⅷ = 8;Ⅻ = 12;
3、小的數字,(限於Ⅰ、X 和C)在大的數字的左邊,所表示的數等於大數減小數得到的數,如:Ⅳ= 4;Ⅸ= 9;
4、正常使用時,連寫的數字重復不得超過三次。
//羅馬數字轉化成整數 public static int romanToInt(String s) { if (s.length() < 1) return 0; int result = 0; int sub = getRomanValue(s.charAt(0)); int lastv = sub; for (int i = 1; i < s.length(); ++i) { char curc = s.charAt(i); int curv = getRomanValue(curc); if (curv == lastv) sub += curv; // 當前一個字符大於當前字符時,情況比較特殊,這個時候,只能講last包括last的字符算在sub內,相加得到result, // 至於curr還需要根據curr后面的字符判斷 else if (curv < lastv) { result += sub; sub = curv; } else { sub = curv - sub; } lastv = curv; } result += sub; return result; } public static int getRomanValue1(char c) { Map<Character, Integer> map = new HashMap<>(); map.put('I', 1); map.put('V', 5); map.put('X', 10); map.put('L', 50); map.put('C', 100); map.put('D', 500); map.put('M', 1000); return map.get(c); } public static int getRomanValue(char c) { switch (c) { case 'I': return 1; case 'V': return 5; case 'X': return 10; case 'L': return 50; case 'C': return 100; case 'D': return 500; case 'M': return 1000; default: return 0; } }