题目
给定罗马数字,将其转换为整数。
输入保证在1到3999的范围内。
举例
// ·个位数举例
// I-1、II-2、III-3、IV-4、Ⅴ-5、VI-6、VII-7、VIII-8、Ⅸ-9
// ·十位数举例
// Ⅹ-10、XI-11、XII-12、XIII-13、XIV-14、XV-15、XVI-16、XVII-17、XVIII-18、XIX-19、XX-20、XXI-21、XXII-22、XXIX-29、XXX-30、XXXIV-34、XXXV-35、XXXIX-39、XL-40、L-50、LI-51、LV-55、LX-60、LXV-65、LXXX-80、XC-90、XCIII-93、XCV-95、XCVIII-98、XCIX-99
// ·百位数举例
// C-100、CC-200、CCC-300、CD-400、D-500、DC-600、DCC-700、DCCC-800、CM-900、CMXCIX-999
// ·千位数举例
// M-1000、MC-1100、MCD-1400、MD-1500、MDC-1600、MDCLXVI-1666、MDCCCLXXXVIII-1888、MDCCCXCIX-1899、MCM-1900、MCMLXXVI-1976、MCMLXXXIV-1984、MCMXC-1990、MM-2000、MMMCMXCIX-3999
分析
- 罗马数字采用七个罗马字母作数字、即Ⅰ(1)、X(10)、C(100)、M(1000)、V(5)、L(50)、D(500)。
-
- 记数的方法:
- 相同的数字连写,所表示的数等于这些数字相加得到的数,如 Ⅲ=3;
- 小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数,如 Ⅷ=8、Ⅻ=12;
- 小的数字(限于 Ⅰ、X 和 C)在大的数字的左边,所表示的数等于大数减小数得到的数,如 Ⅳ=4、Ⅸ=9;
- 在一个数的上面画一条横线,表示这个数增值 1,000 倍,如 =5000。(这个规则应该是用不到了,因为实在不知道怎么打出上划线)
无非就是相邻两个数比较,考察的是代码功底。
代码
package algorithm019;
import java.util.HashMap;
public class Algorithm019 {
// ·个位数举例
// I-1、II-2、III-3、IV-4、Ⅴ-5、VI-6、VII-7、VIII-8、Ⅸ-9
// ·十位数举例
// Ⅹ-10、XI-11、XII-12、XIII-13、XIV-14、XV-15、XVI-16、XVII-17、XVIII-18、XIX-19、XX-20、XXI-21、XXII-22、XXIX-29、XXX-30、XXXIV-34、XXXV-35、XXXIX-39、XL-40、L-50、LI-51、LV-55、LX-60、LXV-65、LXXX-80、XC-90、XCIII-93、XCV-95、XCVIII-98、XCIX-99
// ·百位数举例
// C-100、CC-200、CCC-300、CD-400、D-500、DC-600、DCC-700、DCCC-800、CM-900、CMXCIX-999
// ·千位数举例
// M-1000、MC-1100、MCD-1400、MD-1500、MDC-1600、MDCLXVI-1666、MDCCCLXXXVIII-1888、MDCCCXCIX-1899、MCM-1900、MCMLXXVI-1976、MCMLXXXIV-1984、MCMXC-1990、MM-2000、MMMCMXCIX-3999
public static void main(String[] args) {
romanToInt("MDC");
}
public static int romanToInt(String roman) {
char[] chars = roman.toCharArray();
HashMap<Character, Integer> map = getRomanMap();
if(chars.length == 1)
return map.get(chars[0]);
int sum = 0;
for(int pos=0; pos<chars.length; pos++) {
if(pos <= chars.length -2 && (map.get(chars[pos]) < map.get(chars[pos+1]))) {
sum += (map.get(chars[pos+1]) - map.get(chars[pos]));
pos++;
}else {
sum += map.get(chars[pos]);
}
}
System.out.println(sum);
return sum;
}
public static HashMap<Character, Integer> getRomanMap(){
HashMap<Character, Integer> map = new HashMap<Character, Integer>();
map.put('I', 1);
map.put('X', 10);
map.put('C', 100);
map.put('M', 1000);
map.put('V', 5);
map.put('L', 50);
map.put('D', 500);
return map;
}
}