• leetcode-12-整数转罗马数字


    题目描述:

    罗马数字包含以下七种字符: I, V, X, LCD 和 M

    字符          数值
    I             1
    V             5
    X             10
    L             50
    C             100
    D             500
    M             1000

    例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做  XXVII, 即为 XX + V + II 。

    通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

    • I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
    • X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。 
    • C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。

    给定一个整数,将其转为罗马数字。输入确保在 1 到 3999 的范围内。

    示例 1:

    输入: 3
    输出: "III"

    示例 2:

    输入: 4
    输出: "IV"

    示例 3:

    输入: 9
    输出: "IX"

    示例 4:

    输入: 58
    输出: "LVIII"
    解释: C = 100, L = 50, XXX = 30, III = 3.
    

    示例 5:

    输入: 1994
    输出: "MCMXCIV"
    解释: M = 1000, CM = 900, XC = 90, IV = 4.

     

    要完成的函数:

    string intToRoman(int num) 

    说明:

    1、这道题给定一个十进制的整数,要求转换为罗马数字,最后以字符串的形式返回。

    2、这道题虽然是medium难度的,但其实看清楚题目之后就是一道easy的题目。

    我们把给定的数字划分为几个层次,每个层次不断地加罗马数字,就可以完成这道题目了。

    首先,数字在[1,3999]的范围内,所以数字最大也就是三千多,那么我们第一个层次是大于等于1000的,我们不断地加"M",数字不端-1000。

    其次,数字可能-1000之后,会大于等于900,那么我们加上“CM”,数字-900。

    数字也可能在-1000之后,会大于等于500,那么加上“D”,数字-500。

    数字也可能在-1000之后,会大于等于400,那么加上“CD”,数字-400。

    数字也可能在-1000之后,会大于等于100,那么不断地加上“C”,数字-100。

    然后,数字降到1000以下,可能会大于等于900……按照上面的逻辑继续推理……

    所以,这其实就是一道if else的判断题目,外层套上个循环,代码如下:

        string intToRoman(int num) 
        {
            string res;//最终要返回的res字符串
            while(num)//当数字还没有减小到0的时候,进入循环
            {
                if(num>=1000)
                {
                    res+="M";
                    num-=1000;
                }
                else if(num>=900)
                {
                    res+="CM";
                    num-=900;
                }
                else if(num>=500)
                {
                    res+="D";
                    num-=500;
                }
                else if(num>=400)
                {
                    res+="CD";
                    num-=400;
                }
                else if(num>=100)
                {
                    res+="C";
                    num-=100;
                }
                else if(num>=90)
                {
                    res+="XC";
                    num-=90;
                }
                else if(num>=50)
                {
                    res+="L";
                    num-=50;
                }
                else if(num>=40)
                {
                    res+="XL";
                    num-=40;
                }
                else if(num>=10)
                {
                    res+="X";
                    num-=10;
                }
                else if(num>=9)
                {
                    res+="IX";
                    num-=9;
                }
                else if(num>=5)
                {
                    res+="V";
                    num-=5;
                }
                else if(num>=4)
                {
                    res+="IV";
                    num-=4;
                }
                else//num>=1的情况
                {
                    res+="I";
                    num-=1;
                }
            }
            return res;
        }
    

    上述代码实测48ms,beats 87.46% of cpp submissions。

  • 相关阅读:
    http://kb.cnblogs.com/zt/ef/
    MVC3.0 上传图片并生成缩略图
    简单的js验证码
    KindEditor得不到textarea值的解决方法
    ffmpeg.exe dos下怎么用 放在哪里
    checkbox页面全选
    项目代码风格要求
    缓存
    上传文件大小的问题:超过了最大请求长度
    仿赶集网二手物品页面左侧导航
  • 原文地址:https://www.cnblogs.com/chenjx85/p/9461354.html
Copyright © 2020-2023  润新知