• Integer to Roman


    Given an integer, convert it to a roman numeral.

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

    Question:

    Given an integer, convert it to a roman numeral.

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

    给你一个整数,把它转化为罗马数字,输入保证在1到3999之间。

    关于罗马数字介绍:

           1、计数方法:① 罗马数字就有下面七个基本符号:Ⅰ(1)、Ⅴ(5)、Ⅹ(10)、L(50)、C(100)、D(500)、M(1000)。

                                 ② 相同的数字连写,所表示的数等于这些数字相加得到的数,如:Ⅲ = 3;XX=20;CC=200;MMM=3000;

                                 ③ 小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数, 如:Ⅷ = 8;Ⅻ = 12;

                                 ④ 小的数字,(限于Ⅰ、X 和C)在大的数字的左边,所表示的数等于大数减小数得到的数,如:Ⅳ= 4;Ⅸ= 9;

                                 ⑤  正常使用时连写的数字重复不得超过三次;

       2、组数规则: ① 基本数字Ⅰ、X 、C 中的任何一个,自身连用构成数目,或者放在大数的右边连用构成数目,都不能超过三个;放在大数的左边只能用一个。

                             ② 不能把基本数字V 、L 、D 中的任何一个作为小数放在大数的左边采用相减的方法构成数目;放在大数的右边采用相加的方式构成数目;

                             ③ V 和X 左边的小数字只能用Ⅰ。

                             ④ L 和C 左边的小数字只能用X。

                             ⑤ D 和M 左边的小数字只能用C。

      3、对照举例:    ① 个位举例:Ⅰ,1 】Ⅱ,2】 Ⅲ,3】 Ⅳ,4 】Ⅴ,5 】Ⅵ,6】Ⅶ,7】 Ⅷ,8 】Ⅸ,9 】

                ② 十位举例:Ⅹ,10】 Ⅺ,11 】Ⅻ,12】 XXXV,35 】XXXIX,39】 XL,40】 L,50 】LI,51】 LV,55】 XC,90 】XCIII,93】 XCV,95 】XCVIII,98】

                                    ③ 百位举例: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 】 MCMXC,1990 】MM,2000 】MMMCMXCIX,3999

    参考:http://www.cnblogs.com/zhaolizhen/p/romannumber.html

    科普了一下表达方式,理解了就不复杂了。

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

    其中每两个阶段的之间有一个减法的表示,比如900=CM, C写在M前面表示M-C。

    范围给到3999,感觉情况不多直接打表其实更快,用代码判断表示估计比较繁琐。

    然后就是贪心的做法,每次选择能表示的最大值,把对应的字符串连起来。 

     参考:http://blog.csdn.net/havenoidea/article/details/11848921

    C++实现代码:

    #include<iostream>
    #include<string>
    using namespace std;
    
    class Solution {
    public:
        string intToRoman(int num) {
            int value[]={1000,900,500,400,100,90,50,40,10,9,5,4,1};
            string str[]={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
            int i;
            string ret;
            for(i=0;num>0;i++)
            {
                while(num>=value[i])
                {
                    num-=value[i];
                    ret+=str[i];
                }
            }
            return ret;
        }
    };
    
    int main()
    {
        Solution s;
        cout<<s.intToRoman(3999)<<endl;
    }
  • 相关阅读:
    freenas的踩坑记录:群晖CIFS挂载freeNas的smb共享目录
    【ikuai】爱快软路由上手
    Nacos集成Spring Cloud Gateway使用第三章:nacos配置中心
    Nacos集成Spring Cloud Gateway使用第二章:上手demo
    Nacos集成Spring Cloud Gateway使用第一章:理解解释
    函数指针数组
    回调函数
    使用C语言实现strcpy函数和字符串大小写交换
    Qt : Setting应用程序的数据保存和读取
    Qt 文件操作以及字体颜色选择
  • 原文地址:https://www.cnblogs.com/wuchanming/p/4134560.html
Copyright © 2020-2023  润新知