13. Roman to Integer

来源:互联网 发布:算法就是程序 编辑:程序博客网 时间:2024/06/11 19:32

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;}
0 0