一.规则
1 基本对应关系:罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如,
罗马数字2写做II,即为两个并列的1。
12 写做 XII ,即为 X + II 。
27 写做 XXVII, 即为 XX + V + II 。
2 特例:特殊的规则只适用于以下六种情况
I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
例如:
数字4不写做IIII,而是IV。数字1在数字5的左边,表示大数5减小数1得到的数值4。
二.示例
示例 1:
输入: s = "III"
输出: 3
示例 2:
输入: s = "IV"
输出: 4
示例 3:
输入: s = "IX"
输出: 9
示例 4:
输入: s = "LVIII"
输出: 58
解释: L = 50, V= 5, III = 3.
示例 5:
输入: s = "MCMXCIV"
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.
三.实现思路
1.通过用户输入的罗马数,返回每个字符所对应的数字
2.通过下标来比较每一项和前一项;如果前一项大总数减去前一项;反之加上前一项
3.由于最后一项遍历不到而且肯定相加,在循环后直接相加
四.代码实现
public class lumanumber {
public static void main(String[] args) {
System.out.println(roomnumber("MCMXCIV"));
}
public static int roomnumber(String lm){
// 总和
int sum =0;
// 遍历每一项
for (int i=1;i<lm.length();i++){
int onenumber=getvalue(lm.charAt(i-1));
int twonumber=getvalue(lm.charAt(i));
// 比较前一项和当前项
if (onenumber<twonumber){
sum-=onenumber;
}else {
sum+=onenumber;
}
}
// 最后一项相加
sum+=getvalue(lm.charAt(lm.length()-1));
return sum;
}
public static 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;
}
}
}