古罗马帝国开创了辉煌的人类文明,但他们的数字表示法的确有些繁琐,尤其在表示大数的时候,现在看起来简直不能忍受,所以在现代很少使用了。之所以这样,不是因为发明表示法的人的智力的问题,而是因为一个宗教的原因,当时的宗教禁止在数字中出现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个罗马数字(n<100)。以后每行一个罗马数字。罗马数字大小不超过999。
要求程序输出n行,就是罗马数字对应的十进制数据。
例如,用户输入:
3
LXXX
XCIII
DCCII
则程序应该输出:
80
93
702
注意:
请仔细调试!您的程序只有能运行出正确结果的时候才有机会得分!
在评卷时使用的输入数据与试卷中给出的实例数据可能是不同的。
虽然题目描述的如此高端,但分析一下特点,可以发现,如果是小数在左,大数在右,就是大数减小数,相当于在小数上加一个负号,而对于其他情况,无论是大数在左,小数在右,还是几个重复的,都只是简单的相加而已,于是,我们得到一个结论:从左往右每次取相邻的两个数,如果小数在左大数在右,就在小数的前面加负号,否则不变,最后,把所有变化后的数值相加,就能得到结果,举个例子
X C I I I
10 100 1 1 1
对于(10,100),因为10<100,所以10变成-10,对于(100,1),(1,1)...,都是不需要变化的,所以最终得到的是 -10,100,1,1,1,全部相加就是93,因为题目输入的是字符串,所以应该先对字符串进行处理,将其变成对应的数值
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int cas,i;
int rome_num[20];
char temp[20];
cin>>cas;
while(cas--)
{
int sum=0;
cin>>temp;
for(i=0;i<strlen(temp);i++)
{
if(temp[i]=='I')
rome_num[i]=1;
else if(temp[i]=='V')
rome_num[i]=5;
else if(temp[i]=='X')
rome_num[i]=10;
else if(temp[i]=='L')
rome_num[i]=50;
else if(temp[i]=='C')
rome_num[i]=100;
else if(temp[i]=='D')
rome_num[i]=500;
else if(temp[i]=='M')
rome_num[i]=1000;
}
for(i=0;i<strlen(temp)-1;i++)
{
if(rome_num[i]<rome_num[i+1])
rome_num[i]=-rome_num[i];
sum+=rome_num[i];
}
sum+=rome_num[i];
cout<<sum<<endl;
}
return 0;
}