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

来源:互联网 发布:高仿浪琴手表淘宝店 编辑:程序博客网 时间:2024/06/06 00:11

题目来源:计蒜客


给定一个罗马数字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

IIV4IX9XXL40XC90CCD400CM900

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

#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;elsecount+=100;break;case 'L':count+=50;break;case 'X':if(s[i+1]=='L'||s[i+1]=='C')count-=10;elsecount+=10;break;case 'V':count+=5;break;case 'I':if(s[i+1]=='V'||s[i+1]=='X')count--;elsecount++;break;default:printf("error!\n");}}printf("%d\n",count);return 0;}


0 0
原创粉丝点击