题目描述
小明非常喜欢做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
思路:暴力枚举所有可能情况
#include<stdio.h>
#include<string.h>
int main()
{
char str[30];
int len,i,j,cnt,a[30]={0};
while(scanf("%s",str)!=EOF)
{
cnt=0;
len=strlen(str);
for(i=0;i<len;i++)
{
if(str[i]=='M')
{
a[cnt]=1000;
cnt++;
}
if(str[i]=='C')
{
if(str[i+1]=='D')
{
a[cnt]=400;
cnt++;
str[i+1]='0'; // 此时CD是一个整体了,所以下一个D不用考虑
}
else if(str[i+1]=='M')
{
a[cnt]=900;
cnt++;
str[i+1]='0';
}
else
{
a[cnt]=100;
cnt++;
str[i]='0';//防止后面再重复算比如 XCIX ,后面接着的是if(str[i]=='X'),如果不做处理,会重复算
}
}
if(str[i]=='X')
{
if(str[i+1]=='L')
{
a[cnt]=40;
cnt++;
str[i+1]='0';
}
else if(str[i+1]=='C')
{
a[cnt]=90;
cnt++;
str[i+1]='0';
}
else
{
a[cnt]=10;
cnt++;
str[i]='0';
}
}
if(str[i]=='I')
{
if(str[i+1]=='V')
{
a[cnt]=4;
cnt++;
str[i+1]='0';
}
else if(str[i+1]=='X')
{
a[cnt]=9;
cnt++;
str[i+1]='0';
}
else
{
a[cnt]=1;
cnt++;
str[i]='0';
}
}
if(str[i]=='V')
{
a[cnt]=5;
cnt++;
}
else if(str[i]=='L')
{
a[cnt]=50;
cnt++;
}
else if(str[i]=='D')
{
a[cnt]=500;
cnt++;
}
}
int ans=0;
for(i=0;i<cnt;i++)
{
ans+=a[i];
}
printf("%d\n",ans);
}
}