Fork me on GitHub

12. Integer to Roman

12. Integer to Roman

题目

  • Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 to 3999.
  • 首先要科普一下: 罗马数字
·个位数举例
Ⅰ-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、MDC-1600、MDCLXVI-1666、MDCCCLXXXVIII-1888、MDCCCXCIX-1899、MCM-1900、MCMLXXVI-1976、MCMLXXXIV-1984、MCMXC-1990、MM-2000、MMMCMXCIX-3999

解析

  • 思路一:将所有个十百千位的每一位都列举出来,直接取值即可
  • 思路二:其中每两个阶段的之间有一个减法的表示,比如900=CM, C写在M前面表示M-C。范围给到3999,感觉情况不多直接打表其实更快,用代码判断表示估计比较繁琐。然后就是贪心的做法,每次选择能表示的最大值,把对应的字符串连起来。

I = 1;
V = 5;
X = 10;
L = 50;
C = 100;
D = 500;
M = 1000;

class Solution_12 {
public:
    string intToRoman(int num) {
        char* c[4][10] = {        //指针数组
            { "", "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 roman;
        roman.append(c[3][num / 1000 % 10]);
        roman.append(c[2][num / 100 % 10]);
        roman.append(c[1][num / 10 % 10]);
        roman.append(c[0][num % 10]);

        return roman;
    }

    string intToRoman(int num) {
        string str;
        string symbol[] = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };
        int value[] = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
        for (int i = 0; num != 0; ++i)
        {
            while (num >= value[i])
            {
                num -= value[i];
                str += symbol[i];
            }
        }
        return str;
    }
};

题目来源

posted @ 2018-01-18 19:46 ranjiewen 阅读(...) 评论(...) 编辑 收藏