题目描述
古罗马帝国开创了辉煌的人类文明,但他们的数字表示法的确有些繁琐,尤其在表示大数的时候,现在看起来简直不能忍受,所以在现代很少使用了。之所以这样,不是因为发明表示法的人的智力的问题,而是因为一个宗教的原因,当时的宗教禁止在数字中出现 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,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
本题目的要求是:请编写程序,由用户输入若干个罗马数字串,程序输出对应的十进制表示。
输入描述
第一行是整数 n (n<100) ,表示接下来有 n 个罗马数字。
以后每行一个罗马数字。罗马数字大小不超过 999。
输出描述
要求程序输出 n 行,就是罗马数字对应的十进制数据。
代码实现:
只需要从右往左遍历,出现大于右边的就加,小于右边的就减。
#include<bits/stdc++.h>
using namespace std;
int to_num(char x){
if(x == 'I') return 1;
if(x == 'V') return 5;
if(x == 'X') return 10;
if(x == 'L') return 50;
if(x == 'C') return 100;
if(x == 'D') return 500;
if(x == 'M') return 1000;
}
int main()
{
int n;
cin>>n;
while(n--){
string num;
cin>>num;
int ans = 0;
ans = to_num(num[num.length()-1]);
for(int i = num.length() - 2;i>=0;i--){
if(to_num(num[i]) >= to_num(num[i+1])){
ans+=to_num(num[i]);
}else{
ans-= to_num(num[i]);
}
}
cout<<ans<<endl;
}
return 0;
}