LeetCode 12


这道题的意思是将整形数字转化为罗马数字,只要了解了罗马数字的构成特点就知道怎么将整形数字转化为罗马数字,

转化规则如下:

个位数:

  Ⅰ【1】  Ⅱ【2】 Ⅲ【3】  Ⅳ【4 】  Ⅴ【5 】   Ⅵ【6】 Ⅶ【7】   Ⅷ【8】  Ⅸ【9】

  ·十位数举例

  Ⅹ【10】 Ⅺ【11】Ⅻ【12】 XIII【13】XIV【14】 XV【15】XVI【16】XVII【17】 XVIII【18】XIX【19】 XX【20】 XXI【21 】

        XXII【22 】 XXIX【29】 XXX【30】 XXXIV【34】  XXXV【35】 XXXIX【39】  XL【40】 L【50】 LI【51】 LV【55】  LX【60】 

LXV【65】LXXX【80】XC【90 】XCIII【93】 XCV【95】XCVIII【98】 XCIX【99】

  ·百位数举例

  C【100】 CC【200 】CCC【300 】CD【400】 D【500】DC【600】DCC【700】 DCCC【800】CM【900】  CMXCIX【999】

千位数举例

  M【1000】 MC【1100 】 MCD【1400 】 MD【1500】 MCM【1900】 MCMXC【1990】 MM【2000】  MMMCMXCIX【3999】

可以看出,和"4"和"9"相关的数字的地方都会出现“突变”,这就是罗马数字的特点,掌握了原则后我们很容易就会想到如下代码:

class Solution {
public:
    string intToRoman(int num) {
     // I(1)    V(5)    X(10)   L(50)   C(100)  D(500)  M(1000)
     //范围 1~3999
        string ret;
        if(num < 1 || num > 3999)
         {
             return ret;
         }
         
       
        if(num >= 1000)
        {
             int numofM = num/1000;
             for(int i=0; i < numofM ;++i)
             {
                 ret.push_back('M');
             }
             num-=1000*numofM;
        }
             
        if(num >= 500)
        {
            if(num >=900)
            {//CM(900)
                ret+="CM";
                num-=900;
            }
            else
            {
                ret.push_back('D');
                num-=500;
            }
        }
             
            
        if(num >= 100)
        {
            if(num >= 400)
            {
                ret+="CD";
                num-=400;
            }
            else
            {
                int numofC = num/100;
                for(int i=0;i<numofC;++i)
                {
                     ret.push_back('C');
                }
                num-=numofC*100;
            }
        }
         
        if(num >= 50)
        {//XC(90)
            if(num>=90)
            {
                ret+="XC";
                num-=90;
            }
            else
            {
                ret.push_back('L');
                num-=50;
            }
        }
             
        if(num >= 10)
        {
            if(num >= 40)
            {
                ret+="XL";
                num-=40;
            }
            else
            {
                int numofX = num/10;
                for(int i = 0; i < numofX; ++i)
                {
                    ret.push_back('X');
                }
                num-=10*numofX;
            }
        }
             
        if(num >= 5)
        {
            if(num == 9)
            {//9(IX)
                ret+="IX";
                num-=9;
            }
            else
            {
                ret.push_back('V');
                num-=5;
            }
        }
             
        if(num >= 1)
        {
            if(num == 4)
            {//4(IV)
                ret+="IV";
            }
            else
            {
                for(int i=0; i < num; ++i)
                {
                     ret.push_back('I');
                }
            }
            num=0;
        }
        
        return ret;
    }
};
上面的代码虽然比较长,但是通俗易懂,对每种特殊情况进行单独处理,还是可取的吧~



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值