zoukankan      html  css  js  c++  java
  • [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;
        }
    };
  • 相关阅读:
    CSUFT 1002 Robot Navigation
    CSUFT 1003 All Your Base
    Uva 1599 最佳路径
    Uva 10129 单词
    欧拉回路
    Uva 10305 给任务排序
    uva 816 Abbott的复仇
    Uva 1103 古代象形文字
    Uva 10118 免费糖果
    Uva 725 除法
  • 原文地址:https://www.cnblogs.com/aprilcheny/p/4910506.html
Copyright © 2011-2022 走看看