zoukankan      html  css  js  c++  java
  • 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;
        }
    };
    
  • 相关阅读:
    设计模式
    刷新所有视图存储过程
    js杨辉三角控制台输出
    2018申请淘宝客AppKey
    w3c标准 dom对象 事件冒泡和事件捕获
    promise原理
    vue virtual Dom
    css学习
    seo优化
    新概念学习
  • 原文地址:https://www.cnblogs.com/shayue/p/10332661.html
Copyright © 2011-2022 走看看