Leetcode c语言-Roman to Integer

来源:互联网 发布:weibull++软件下载 编辑:程序博客网 时间:2024/06/05 10:36

Title:

Given a roman numeral, convert it to an integer.

Input is guaranteed to be within the range from 1 to 3999.


这道题和上道题相反,将罗马数字转换成数字。


两种解法:

第一种,穷举法,列举出所有可能。

这是所有罗马数字的整数,从1-3999. 任意一个数字都可以由下列进行组合得到。

            {"","I","II","III","IV","V","VI","VII","VIII","IX"},
            {"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"},
            {"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"},
            {"","M","MM","MMM"}
因此只需要检测给出的罗马数字中这些字母的排列即可。

int romanToInt(char* s) {    int result;    int i=0;    int a = 0;    int b=0;    int c=0;    int d=0;        while (s[i]) {        if (s[i] == 'M') {            if (i>=1 && s[i-1]=='C')                b=900;            else                a=a+1000;        }        else if (s[i] == 'C') {            if (i>=1 && s[i-1]=='X')                c=90;            else if (s[i+1]=='D')                b=400;            else if (i>=1 && s[i-1]=='D')                b=600;            else if (i>=2 && s[i-1]=='C' && s[i-2]=='D')                b=700;            else if (i>=3 && s[i-1]=='C' && s[i-2]=='C' && s[i-3]=='D')                b=800;            else if (i>=0 && s[i+1]!='M')                b=b+100;        }        else if (s[i] == 'D') {            if (s[i-1]!='C' && s[i+1]!='C')                b=500;        }        else if (s[i] == 'X') {            if (s[i+1] == 'L')                c=40;            else if (i>=1 && s[i-1]=='L')                c=60;            else if (i>=2 && s[i-1]=='X' && s[i-2]=='L')                c=70;            else if (i>=3 && s[i-1]=='X' && s[i-2]=='X' && s[i-3]=='L')                c=80;            else if (i>=1 && s[i-1]=='I')                d=9;            else if (i>=0 && s[i+1]!='C'){                c=c+10;            }        }        else if (s[i] == 'L') {            if (i>=1 && s[i-1]!='X' && s[i+1]!='X')                c=50;            else if (i<1 && s[i+1]!='X')                c=50;                    }        else if (s[i] == 'I') {            if (s[i+1] == 'V')                d=4;            else if (i>=1 && s[i-1]=='V')                d=6;            else if (i>=2 && s[i-1]=='I' && s[i-2]=='V')                d=7;            else if (i>=3 && s[i-1]=='I' && s[i-2]=='I' && s[i-3]=='V')                d=8;            else if (i>=0 && s[i+1]!='X')                d=d+1;        }        else if (s[i] == 'V') {            if (s[i-1]!='I' && s[i+1]!='I')                d=5;        }        i++;    }    result = a+b+c+d;    return result;}



第二种解法,掌握罗马数字书写的规律:

  1. 相同的数字连写、所表示的数等于这些数字相加得到的数、如:Ⅲ=3;
  2. 小的数字在大的数字的右边、所表示的数等于这些数字相加得到的数、 如:Ⅷ=8、Ⅻ=12;
  3. 小的数字(限于 I、X 和 C)在大的数字的左边、所表示的数等于大数减小数得到的数、如:Ⅳ=4、Ⅸ=9;
  4. 正常使用时、连写的数字重复不得超过三次;
基本字符
I
V
X
L
C
D
M
相应的阿拉伯数字表示为
1
5
10
50
100
500
1000


比如XCIX,首先判断XC,X小于C,因此是相减C-X=90,然后跳两位再进行判断,IX,10-1=9,所以XCIX表示99。


Solutions:

int toNumber(char ch) {          switch (ch) {              case 'I': return 1;              case 'V': return 5;              case 'X': return 10;              case 'L': return 50;              case 'C': return 100;              case 'D': return 500;              case 'M': return 1000;              default: return 0;        }       }int romanToInt(char* s) {int total=0;    char *p=s;    int i=0;    int a=0;    int b=0;    while(p[i]!='\0')    {        a=toNumber(p[i]);        b=toNumber(p[i+1]);       if(a>=b)        {       total=a+total;       i=i+1;       }       if(a<b)       {        total=total+b-a;        i=i+2;       }     }    return total;   }


原创粉丝点击