程序员

LeetCode12: Integer to Roman

2018-05-13  本文已影响0人  Jesson3264

题目链接:https://leetcode.com/problems/integer-to-roman/description/

这是我写过最长的 switch case.
题目的意思大概是:将十进制数转为罗马形式。
思路:每一个十进制位用一个罗马字母表示,最大的数是3999,所以只要把一个数拆成每一位的数相加就兴。举个例子:
比如要求:3789, 拆成 300+700+80+9 就可以了,
然后switch case 每个数字就行了。 有什么更好到方法缩短代码吗?

class Solution{
public:
    string intToRoman(int num) {
        string retStr;
        int tNextNum = 0;
        tNextNum = getNextNum(num);
        while (tNextNum)
        {
            //handle
//            cout<<"num:"<<tNextNum<<endl; 
            num  -= tNextNum;
            //编码
            switch (tNextNum)
            {
                case 1:
                    retStr.push_back('I');
                    break;       
                    case 2:
                    retStr.push_back('I');
                    retStr.push_back('I');
                    break;
                case 3:
                    retStr.push_back('I');
                    retStr.push_back('I');
                    retStr.push_back('I');
                    break;
                case 4:
                    retStr.push_back('I');
                    retStr.push_back('V');
                    break;
                case 5:
                    retStr.push_back('V');
                    break;
                case 6:
                    retStr.push_back('V');
                    retStr.push_back('I');
                    break;
                case 7:
                    retStr.push_back('V');
                    retStr.push_back('I');
                    retStr.push_back('I');
                    break;
                case 8:
                    retStr.push_back('V');
                    retStr.push_back('I');
                    retStr.push_back('I');
                    retStr.push_back('I');
                    break;
                case 9:
                    retStr.push_back('I');
                    retStr.push_back('X');
                    break;
                 case 10:
                    retStr.push_back('X');
                    break;
                case 20:
                    retStr.push_back('X');
                    retStr.push_back('X');
                    break;
                case 30:
                    retStr.push_back('X');
                    retStr.push_back('X');
                    retStr.push_back('X');
                    break;
                case 40:
                    retStr.push_back('X');
                    retStr.push_back('L');          
                    break;
                case 50:
                    retStr.push_back('L');
                    break;
                case 60:
                    retStr.push_back('L');
                    retStr.push_back('X');
                    break;
                case 70:
                    retStr.push_back('L');
                    retStr.push_back('X');
                    retStr.push_back('X');
                    break;
                case 80:
                    retStr.push_back('L');
                    retStr.push_back('X');
                    retStr.push_back('X');
                    retStr.push_back('X');
                    break;
                case 90:
                    retStr.push_back('X');
                    retStr.push_back('C');
                    break;
                  case 100:
                    retStr.push_back('C');
                    break;
                case 200:
                    retStr.push_back('C');
                    retStr.push_back('C');
                    break;
                case 300:
                    retStr.push_back('C');
                    retStr.push_back('C');
                    retStr.push_back('C');
                    break;
                case 400:
                    retStr.push_back('C');
                    retStr.push_back('D');
                    break;
                case 500:
                    retStr.push_back('D');
                    break;
                case 600:
                    retStr.push_back('D');
                    retStr.push_back('C');
                    break;
                case 700:
                    retStr.push_back('D');
                    retStr.push_back('C');
                    retStr.push_back('C');
                    break;
                case 800:
                    retStr.push_back('D');
                    retStr.push_back('C');
                    retStr.push_back('C');
                    retStr.push_back('C');
                    break;
                case 900:
                    retStr.push_back('C');
                    retStr.push_back('M');
                    break;
                   case 1000:
                         retStr.push_back('M');
                         break;
                    case 2000:
                        retStr.push_back('M');
                        retStr.push_back('M');
                        break;
                case 3000:
                        retStr.push_back('M');
                        retStr.push_back('M');
                        retStr.push_back('M');
                       break;
                }//end switch
                tNextNum = getNextNum(num); 
            }//end while
            return retStr;
        }   
        //  获取下一个要编码的数字
        int getNextNum(int num)
        {   
            if (0==num)
                return 0;
            if(num<10)
                return num;
            int ret = 0;
            int carry = 1;
            num /=10;
            int tmp = num;
            while(num)
            {   
                tmp = num;
                carry *=10;
                num /=10;
            }   
            return tmp*carry;
        }   
    };  
‵‵‵
上一篇 下一篇

猜你喜欢

热点阅读