Leetcode c语言-Roman to Integer

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


posted on 2017-09-11 22:18  sichenzhao  阅读(117)  评论(0编辑  收藏  举报

导航