罗马数字问题

罗马数字是欧洲在阿拉伯数字(实际上是印度数字)传入之前使用的一种数码,现在应用较少.它的产生晚于中国甲骨文中的数码,更晚于埃及人的十进位数字.但是,它的产生标志着一种古代文明的进步.  罗马数字用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;放在循环之外,否则就会出现不正确的结果了!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值