罗马数字是欧洲在阿拉伯数字(实际上是印度数字)传入之前使用的一种数码,现在应用较少.它的产生晚于中国甲骨文中的数码,更晚于埃及人的十进位数字.但是,它的产生标志着一种古代文明的进步. 罗马数字用7个拉丁字母IVXLCDM和读数规则来表示数. I = 1 V = 5 X = 10 L = 50 C = 100 D = 500 M = 1000 读数规则有以下三条 (1)相同的数字连写,所表示的数等于这些数字相加得到的数,如:III就代表3; (2)小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数.如:VIII =8,XII=12; (3)小的数字在大的数字的左边,所表示的数等于大数减小数得到的数,如IV=4.IX =9. 注意不会出现IIX这样的情况,即每个数字左边最多有一个值比它小的数字. 现在给你一些罗马数字表示下的数,要求你编写程序把它转换为用阿拉伯数字表示.
Input
输入文件包含多组测试数据,每组测试数据一行,给出一个罗马数字表示的数,只包含IVXLCDM的合法组合,字母子间没有空白字符.确保转换得到的阿拉伯数字不会超过3000.
Output
对于每一组测试数据,对应输出其阿拉伯数字表示.
Sample Input
DXII
Sample Output
512
结果对但不AC的源代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char ma[10];
char com[7]={'I','V','X','L','C','D','M'};
int i,t,num[20],sum=0;
while(scanf("%s",ma)!=EOF)
{
t=strlen(ma);
for(i=0;i<t;i++)
{
switch(ma[i])
{
case'I':num[i]=1;break;
case'V':num[i]=5;break;
case'X':num[i]=10;break;
case'L':num[i]=50;break;
case'C':num[i]=100;break;
case'D':num[i]=500;break;
case'M':num[i]=1000;break;
}
}
for(i=0;i<t-1;i++)
{
if(num[i]<num[i+1])
sum-=num[i];
else
sum+=num[i];
}
sum+=num[t-1];
printf("%d\n",sum);
sum=0;
}
return 0;
}
修改后AC代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char ma[10];
char com[7]={'I','V','X','L','C','D','M'};
int i,t,num[20],sum=0;
while(scanf("%s",ma)!=EOF)
{
t=strlen(ma);
for(i=0;i<t;i++)
{
switch(ma[i])
{
case'I':num[i]=1;break;
case'V':num[i]=5;break;
case'X':num[i]=10;break;
case'L':num[i]=50;break;
case'C':num[i]=100;break;
case'D':num[i]=500;break;
case'M':num[i]=1000;break;
}
}
for(i=0;i<t-1;i++)
{
if(num[i]<num[i+1])
sum-=num[i];
else
sum+=num[i];
}
sum+=num[t-1];
printf("%d\n",sum);
sum=0;
}
return 0;
}
就差那么一点,没有考虑到把比较之后的数放到num[i+1]中无形放大了要用来比较的数字,因此,此处必须引进SUM来替换num[i+1]!!!还有在循环的时候要记得把sum=0;放在循环之外,否则就会出现不正确的结果了!