罗马数字串
古罗马帝国开创了辉煌的人类文明,但他们的数字表示法的确有些繁琐,尤其在表示大数的时候,现在看起来简直不能忍受,
所以在现代很少使用了。之所以这样,不是因为发明表示法的人的智力的问题,而是因为一个宗教的原因,
当时的宗教禁止在数字中出现0的概念!
罗马数字的表示主要依赖以下几个基本符号:
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
这里,我们只介绍一下1000以内的数字的表示法。
单个符号重复多少次,就表示多少倍。最多重复3次。比如:CCC表示300 XX表示20,但150并不用LLL表示,这个规则仅适用于I X C M。
如果相邻级别的大单位在右,小单位在左,表示大单位中扣除小单位。比如:IX表示9 IV表示4 XL表示40 更多的示例参见下表,
你找到规律了吗?
本题目的要求是:请编写程序,由用户输入若干个罗马数字串,程序输出对应的十进制表示。
输入格式是:第一行是整数n,表示接下来有n个罗马数字
要求程序输出n行,就是罗马数字对应的十进制数据。
例如,用户输入:
3
LXXX
XCIII
DCCII
则程序应该输出:
80
93
古罗马帝国开创了辉煌的人类文明,但他们的数字表示法的确有些繁琐,尤其在表示大数的时候,现在看起来简直不能忍受,
所以在现代很少使用了。之所以这样,不是因为发明表示法的人的智力的问题,而是因为一个宗教的原因,
当时的宗教禁止在数字中出现0的概念!
罗马数字的表示主要依赖以下几个基本符号:
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
这里,我们只介绍一下1000以内的数字的表示法。
单个符号重复多少次,就表示多少倍。最多重复3次。比如:CCC表示300 XX表示20,但150并不用LLL表示,这个规则仅适用于I X C M。
如果相邻级别的大单位在右,小单位在左,表示大单位中扣除小单位。比如:IX表示9 IV表示4 XL表示40 更多的示例参见下表,
你找到规律了吗?
I,1 II,2 III,3 IV,4 V,5 VI,6 VII,7 VIII,8 IX,9 X,10 XI,11 XII,12 XIII,13 XIV,14XV,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,55LX,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 |
输入格式是:第一行是整数n,表示接下来有n个罗马数字
要求程序输出n行,就是罗马数字对应的十进制数据。
例如,用户输入:
3
LXXX
XCIII
DCCII
则程序应该输出:
80
93
702
自己简单写了一下,大家看看有没有值得改进的地方?
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class H8 {
@SuppressWarnings("resource")
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
List<String> inputList = new ArrayList<>();
for(int i=0;i<n;i++) {
inputList.add(scanner.next());
}
int[] weight = new int[]{1,5,10,50,100,500,1000};
List<Character> symbol = new ArrayList<>();
symbol.add('I');
symbol.add('V');
symbol.add('X');
symbol.add('L');
symbol.add('C');
symbol.add('D');
symbol.add('M');
for(String input:inputList){
int sum=0;
for(int i=0;i<input.length();i++) {
char c = input.charAt(i);
char nextc = i==input.length()-1?'U':input.charAt(i+1);//如果i=长度-1,则会越界,置换成'U',indexof返回-1
if(symbol.indexOf(nextc)<=symbol.indexOf(c)) {//如果下一个索引大于当前,则将当前值加入和
sum+=weight[symbol.indexOf(c)];
}else{
sum-=weight[symbol.indexOf(c)];
}
}
System.out.println(sum);
}
}
}