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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值