罗马数字转整数
问题产生
罗马数字包含以下七种字符: I
, V
, X
, L
,C
,D
和 M
。
1 2 3 4 5 6 7 8
| 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000
|
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。
示例:
1 2 3
| 输入: "MCMXCIV" 输出: 1994 解释: M = 1000, CM = 900, XC = 90, IV = 4.
|
问题分析
按照题目的描述,可以总结如下规则:
罗马数字由 I,V,X,L,C,D,M 构成;
当小值在大值的左边,则减小值,如 IV=5-1=4;
当小值在大值的右边,则加小值,如 VI=5+1=6;
由上可知,右值永远为正,因此最后一位必然为正。
一言蔽之,把一个小值放在大值的左边,就是做减法,否则为加法。
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| public class RomeToInt { public int rometoint(String s){ int sum=0; int preNum=getValue(s.charAt(0)); for(int i=1;i<s.length();i++){ int curNum=getValue(s.charAt(i)); if(curNum<=preNum){ sum+=preNum; }else{ sum-=preNum; } preNum=curNum; } sum+=preNum; return sum;
} private int getValue(char ch){ switch (ch){ 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; } }
public static void main(String[] args){ String s="XXVII"; RomeToInt romeToInt=new RomeToInt(); System.out.println(romeToInt.rometoint(s)); } }
|