Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
这道题主要是先了解罗马数字的规则,了解了就简单了。
罗马数字是阿拉伯数字传入之前使用的一种数码。罗马数字采用七个罗马字母作数字、即Ⅰ(1)、X(10)、C(100)、M(1000)、V(5)、L(50)、D(500)。记数的方法:
相同的数字连写,所表示的数等于这些数字相加得到的数,如 Ⅲ=3;
小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数,如 Ⅷ=8、Ⅻ=12;
小的数字(限于 Ⅰ、X 和 C)在大的数字的左边,所表示的数等于大数减小数得到的数,如 Ⅳ=4、Ⅸ=9;
初始代码
#include<stdio.h>
#include<string.h>
int rank(char a)
{
if(a=='I')
return 1;
else if(a=='V')
return 2;
else if(a=='X')
return 3;
else if(a=='L')
return 4;
else if(a=='C')
return 5;
else if(a=='D')
return 6;
else
return 7;
}
int number(char a)
{
switch(a)
{
case'I':return 1;break;
case'X':return 10;break;
case'C':return 100;break;
case'M':return 1000;break;
case'V':return 5;break;
case'L':return 50;break;
case'D':return 500;break;
default:return 0;break;
}
}
int romanToInt(char* s)
{
int sum=0,i;
for(i=0;i<strlen(s)-1;i++)
{
if(rank(s[i])<rank(s[i+1]))
sum=sum-number(s[i]);
else
sum=sum+number(s[i]);
}
sum=sum+number(s[i]);
return sum;
}
int main()
{
char s[20];
scanf("%s",s);
printf("%d\n",romanToInt(s));
return 0;
}
后来我想着太麻烦了,可以改进,因为字母优先级和它的数字是对应的,越大优先级越高,所以用一个函数就可以了,然后再循环的时候吧strlen也去掉,时间确实减少了不少。
#include<stdio.h>
#include<string.h>
int number(char a)
{
switch(a)
{
case'I':return 1;break;
case'V':return 5;break;
case'X':return 10;break;
case'L':return 50;break;
case'C':return 100;break;
case'D':return 500;break;
case'M':return 1000;break;
default:return 0;break;
}
}
int romanToInt(char* s)
{
int sum=0,i;
for(i=0;s[i];i++)
{
if(s[i+1]&&(number(s[i])<number(s[i+1])))
sum=sum-number(s[i]);
else
sum=sum+number(s[i]);
}
return sum;
}
int main()
{
char s[20];
scanf("%s",s);
printf("%d\n",romanToInt(s));
return 0;
}