【计蒜客系列】挑战难题14:罗马数字转换成整数

题目来源:计蒜客


给定一个罗马数字s,( I<=s<=MMMCMXCIX)(即1到3999),将罗马数字转换成整数。

如罗马数字I,II,III,IV,V分别代表数字1, 2, 3, 4, 5。
格式:
   第一行输入一个罗马数字,接下来输出对应的整数。
提示:
   首先要来了解一下罗马数字表示法,基本字符有7个:I,V,X,L,C,D,M,分别表示1,5,10,50,100,500,1000。
在构成数字的时候,有下列规则:
1、相同的数字连写,所表示的数等于这些数字相加得到的数,如:Ⅲ = 3;
2、小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数, 如:Ⅷ = 8;Ⅻ = 12;
3、小的数字,(限于Ⅰ、X 和C)在大的数字的左边,所表示的数等于大数减小数得到的数,如:Ⅳ= 4;Ⅸ= 9;
4、正常使用时,连写的数字重复不得超过三次。
样例1
输入:
CXXIII
输出:

123


注:

1、基本数字Ⅰ、中的任何一个,自身连用构成数目,或者放在大数的右边连用构成数目,都不能超过三个;放在大数的左边只能用一个。

2、不能把基本数字中的任何一个作为小数放在大数的左边采用相减的方法构成数目;放在大数的右边采用相加的方式构成数目,只能使用一个。

3左边的小数字只能用Ⅰ。

4左边的小数字只能用X

5左边的小数字只能用C

IIV4IX9
XXL40XC90
CCD400CM900

一个字符一个字符的向后计算。

#include<stdio.h>
#include<string.h>

int main(int argc, char **argv)
{
    char s[100];
	int i,len,count=0;
    scanf("%s",&s);
	len= strlen(s);
	for(i=0;i<len;i++)
	{
		switch(s[i])
		{
		case 'M':
			count+=1000;
			break;
		case 'D':
			count+=500;
			break;
		case 'C':
			if(s[i+1]=='D'||s[i+1]=='M')
				count-=100;
			else
				count+=100;
			break;
		case 'L':
			count+=50;
			break;
		case 'X':
			if(s[i+1]=='L'||s[i+1]=='C')
				count-=10;
			else
				count+=10;
			break;
		case 'V':
			count+=5;
			break;
		case 'I':
			if(s[i+1]=='V'||s[i+1]=='X')
				count--;
			else
				count++;
			break;
		default:
			printf("error!\n");
		}
	}

	printf("%d\n",count);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值