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;
        }
    };
  • 相关阅读:
    狼人杀BETA阶段计划简介
    Werewolf流程分析
    Alpha阶段项目Postmortem
    Alpha阶段项目展示
    龙威零式_团队项目例会记录_24
    数据获取以及处理系统 --- 功能规格说明书V2.0
    项目Postmortem
    龙威零式_团队项目例会记录_23
    Alpha版本发布说明
    Alpha版本项目展示
  • 原文地址:https://www.cnblogs.com/aprilcheny/p/4910506.html
Copyright © 2011-2022 走看看