题目描述
小明非常喜欢做a+b的算术题,为此他搜集了很多的练习题。 今天他拿到一个很古老的练习册,上面是使用罗马数字表示的。 小明不太擅长处理罗马数字,请你帮帮他,告诉他罗马数字对应的十进制数的值。 罗马数字是使用字母组合表示数字的,不同的字母表示的值如下表:
字母 | 值 |
---|---|
I | 1 |
V | 5 |
X | 10 |
L | 50 |
C | 100 |
D | 500 |
M | 1000 |
表示规则如下:
- 数字的值是为所有字母的值的和。比如说II=2,XIII=13
- 没有0,比如207使用两个100,1个5,2个1表示,即CCVII
- 字母应该按值的降序从左到右排列,但为了避免太多的重复(比如IIII),使用减法来缩短式子
- 使用I在V和X前,表示4(IV)和9(IX)
- 使用X在L和C前,表示40(XL)和90(XC)
- 使用C在D和M前,表示400(CD)和900(CM)
输入
每行输入一个罗马数字,字符串长度不超过25。测试数据保证是合法的罗马数字。
输出
每行输出对应罗马数字的十进制整数。
样例输入
MM CM MCD MDX XCIX
样例输出
2000 900 1400 1510 99
这道题只要知道了方法就很容易解出。
为了简便,可以先将每个字符转换为其所代表的数。
接下来,我们可以从最右边向左边依次进行运算:
设a,b,c为字符所代表的数,和为sum,然后进行判断,如果b大于c,则sum =c + b,如果b小于c,
sum = c - b。每次比较相邻的两个数,通过循环求出sum的最终结果即为所求的值。
#include <stdio.h>
#include <string.h>
char str[26];
int num[26];
void shift(int i)
{
if(str[i]=='I')
num[i] = 1;
if(str[i]=='V')
num[i] = 5;
if(str[i]=='X')
num[i] = 10;
if(str[i]=='L')
num[i] = 50;
if(str[i]=='C')
num[i] = 100;
if(str[i]=='D')
num[i] = 500;
if(str[i]=='M')
num[i] = 1000;
}
int main()
{
int i,len,sum;
while(scanf("%s",str)!=EOF)
{
len = strlen(str);
for(i = 0;i < len;i++)
shift(i);//将字符转换为其所代表的数
sum = num[len-1];
for(i = len-2;i >= 0;i--)
{
if(num[i] >= num[i+1])
sum += num[i];
else
sum -= num[i];
}
printf("%d\n",sum);
}
}