• 12. 整数转罗马数字


    题目描述


    罗马数字包含以下七种字符: I,V,X,L,C,D 和 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"
    解释: L = 50, V = 5, III = 3.

    示例 5:

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

    算法

    穷举所有可能的情况,原本的7个字符再加上6种另外的组合,一共是13种;只不过我自己写的代码比较冗余。看了评论中另外一个答主 primerprimer1 的答案,也贴上做一个对比,如有侵权请联系我删除。

    代码

    #include <iostream>
    #include <string>
    using namespace std;
    
    /***
    字符          数值
    I             1
    IV            4
    V             5
    IX            9
    X             10
    XL            40
    L             50
    XC            90
    C             100
    CD            400
    D             500
    CM            900
    M             1000
    ***/
    class Solution {
    public:
        string intToRoman(int num) {
            string backStr = "";
            int M_num = num / 1000;
            for(int i = 0; i < M_num; i++)
                backStr += 'M';
            num = num % 1000;
            if(num == 0)
                return backStr;
            
            int flag = num / 900;
            if(flag == 1)
                backStr += "CM";
            num = num % 900;
            if(num == 0)
                return backStr;
            
            flag = num / 500;
            if(flag == 1)
                backStr += 'D';
            num = num % 500;
            if(num == 0)
                return backStr;
            
            flag = num / 400;
            if(flag == 1)
                backStr += "CD";
            num = num % 400;
            if(num == 0)
                return backStr;
            
            int C_num = num / 100;
            for(int i = 0; i < C_num; i++)
                backStr += 'C';
            num = num % 100;
            if(num == 0)
                return backStr;
            
            flag = num / 90;
            if(flag == 1)
                backStr += "XC";
            num = num % 90;
            if(num == 0)
                return backStr;
            
            flag = num / 50;
            if(flag == 1)
                backStr += 'L';
            num = num % 50;
            if(num == 0)
                return backStr;
            
            flag = num / 40;
            if(flag == 1)
                backStr += "XL";
            num = num % 40;
            if(num == 0)
                return backStr;
            
            int X_num = num / 10;
            for(int i = 0; i < X_num; i++)
                backStr += 'X';
            num = num % 10;
            if(num == 0)
                return backStr;
            
            flag = num / 9;
            if(flag == 1)
                backStr += "IX";
            num = num % 9;
            if(num == 0)
                return backStr;
            
            flag = num / 5;
            if(flag == 1)
                backStr += 'V';
            num = num % 5;
            if(num == 0)
                return backStr;
            
            flag = num / 4;
            if(flag == 1)
                backStr += "IV";
            num = num % 4;
            if(num == 0)
                return backStr;
            
            int I_num = num;
            for(int i = 0; i < I_num; i++)
                backStr += 'I';
            
            return backStr;
        }
    };
    
    int main()
    {
        Solution s;
        cout << s.intToRoman(4) << endl;
        return 0;
    }
    

    这是primerprimer1的答案,很有美感的代码。

    class Solution {
    public:
        string intToRoman(int num) {
            int values[]={1000,900,500,400,100,90,50,40,10,9,5,4,1};
            string reps[]={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
            
            string res;
            for(int i=0; i<13; i++){
                while(num>=values[i]){
                    num -= values[i];
                    res += reps[i];
                }
            }
            return res;
        }
    };
    
  • 相关阅读:
    有几个点会导致插件包不出现
    JScrollPane恢复正常滚动量
    java jlabel 对齐_java将JLabel中的文本右对齐
    SVN的安装和使用手册
    idea生成类注释和方法注释的正确方法
    关于RCP中英文的一些总结
    精通Hibernate类与类关联关系:[一]建立多对一的单向关联关系
    Hibernate笔记=>继承关系的映射[转 王继彬]
    Unity(六):使用场景Ⅲ:用于依赖注入(上)
    NHibernate之旅(13):初探立即加载机制[转 Blog 李永京]
  • 原文地址:https://www.cnblogs.com/shayue/p/10332661.html
Copyright © 2020-2023  润新知