[LeetCode]43. Integer to Roman整数转罗马数字

Given an integer, convert it to a roman numeral.

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

解法:与罗马数字转整数过程相反。例如数字2438,罗马数字表示为MM CD XXX VIII,即是每个分位上的数字分别用当前分位的基数表示即可。因为整数范围在[1,3999],不需要考虑数字上加横线的情况。每个分位上分几种情况:

(1)千位:1000-3000,分别为M、MM、MMM

(2)百位:100-300:C、CC、CCC;400:CD;500-800:D、DC、DCC、DCCC;900:CM

(3)十位:10-30:X、XX、XXX;40:XL;50-80:L、LX、LXX、LXXX;90:XC

(4)个位:1-3:I、II、III;4:IV;5-8:V、VI、VII、VIII;9:IX

因此使用最笨的办法,直接建表然后查表即可。

class Solution {
public:
    string intToRoman(int num) {
        string romanTab[4][9] =
        {
            {"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"},
        };
        string res = "";
        int i = 3;
        while (num > 0)
        {
            int dig = num / (int)pow(10, i);
            res = dig > 0 ? res + romanTab[i][dig - 1] : res;
            num %= (int)pow(10, i);
            --i;
        }
        return res;
    }
};

或者根据上面的分析情况先取出每个分位上的数字,与4/8/9进行比较,然后确定每个分位的表示:

class Solution {
public:
    string intToRoman(int num) {
        string roman[] = {"M", "D", "C", "L", "X", "V", "I"};
        int value[] = {1000, 500, 100, 50, 10, 5, 1};
        string res = "";
        for(int i = 0; i < 7; i+= 2)
        {
            int dig = num / value[i]; //获得每个分位上的数字
            //分四种情况考虑,注意千分位上数字最大为3
            if(dig < 4) 
            {
                for(int j = 0; j < dig; j++)
                    res += roman[i];
            }
            else if(dig == 4)
                res += roman[i] + roman[i - 1];
            else if(dig > 4 && dig < 9)
            {
                res += roman[i - 1];
                for(int j = 0; j < dig - 5; ++j)
                    res += roman[i];
            }
            else if(dig == 9)
                res += roman[i] + roman[i - 2];
            num %= value[i];
        }
        return res;
    }
};
原文地址:https://www.cnblogs.com/aprilcheny/p/4910506.html