Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
要求输入一个罗马数字,将其转化为整数,其范围在1到3999之间。
要弄清楚这个题目首先需要搞清楚罗马数字的工作流程。
不谈别的我就直接上例子了:
I 1
V 5,来源于五个手指的形状。
X 10,来源于两手交握的形状。
L 50,共和时期写作⊥,有时候下面那横是有弧度的。
C 100,可能来源于centum的缩写
Iɔ或Ð 500,ɔ应该是大写的(打不出来了);Ð中间有一横,现代拉丁文写作D。
CIɔ或M 1000,M来源于mille的缩写,不常用。
Φ∞ 也表示1000,常在铭文中使用,实际上D的产生,就是把Φ的一半。
Q 500000,是quingenta milia的缩写。
其他的数字都由这些基本数字重复、组合或二者结合而成。
比如:
Ⅱ=2 XX=20 CCC=300
请注意V和L不重复使用。
如果小数位于大数之前(即处于大数左侧),请将大数减去小数
IX=9 XL=40
如果小数位于大数之后(即处于大数右侧),请将两者相加
LX=60 DC=600
在一个数字中,后者要优先于前者
CCXIV=CC+X+IV=214 而非 CC+XI+V=200+11+5=216
216应该写作CCXVI
如果一个小数出现在两个大数中间,它要被右侧的大数减去
MCM=1900
这边最值得注意的是后者要优先于前者,由于这句话的存在于是我们想到是否可以从后向前遍历的方式进行取值,知道这点之后我们开始。
public class RomanToInt { public static void main(String[] args){ String s = "DCXXI"; romanToInt(s); } public static int romanToInt(String s) { if(s == null) return 0; // 防止错误输入 int latestVal = 0; // 当前值 int curVal = 0; // 总数 int lastVal = changeCharToInt(""+s.charAt(s.length()-1)); // 上一个的值,赋初值,以防循环中ifelse判断错误 // 从后向前遍历字符串 for (int i=s.length()-1;i>=0;i--){ latestVal = changeCharToInt(""+s.charAt(i)); if(latestVal>=lastVal) curVal+=latestVal; else curVal = curVal-latestVal; lastVal = latestVal; } return curVal; } public static int changeCharToInt(String s){ // 单个字符判断函数 按照罗马字符规律来就行 switch (s.toUpperCase()){ 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; } } }