02-chisel-tutorial代码学习之组合逻辑

简单数据复杂数据的区别

  返回  

整数转罗马数字c++

2021/8/20 22:38:45 浏览:
  1. 题目:
    字符 数值
    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。
给你一个整数,将其转为罗马数字。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/integer-to-roman
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

  1. 解题思路:
    我本来使用的是暴力解法,但是算法题要是使用暴力算法相当于是没做出来,参考了网上大神的代码之后才找到了这个解决方法。
    首先是我们可以分析出所有的数字都是由1000,900,500,400,100,90,50,40,10,9,5,4,1来表示,然后罗马数字的特点是每一位都是尽量采用最大的数来表示,我们可以联想到每次减去这个数当前所能包含的这个数组中的最大的一个数来最为当前位的罗马数字,这样就能依次表示出这个数,能想出这个方法的大神真是太厉害了!
  2. 解题代码:
string intToRoman(int num) {
        string res;
        int list[13] = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
        string list2[] = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
        for(int i =0;i < 13;i++){
            while(num >= list[i]){
                res.append(list2[i]);
                num -= list[i]; 
            }
        }
        return res;
    }
  1. tips:
//使用string()来进行字符串的分割时要分清此字符串是char数组还是string类对象,char数组是从0开始到这个索引,string类对象是从这个索引开始到结束。
string str13 = string("hello world",5)      // str13 = "hello"  而非  " world"


引用大佬文章(写的很全面很好):

https://blog.csdn.net/qq_30534935/article/details/82227364?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162946874416780265487310%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=162946874416780265487310&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allbaidu_landing_v2~default-3-82227364.ecpm_v1_rank_v29&utm_term=c%2B%2BSTRING&spm=1018.2226.3001.4187

联系我们

如果您对我们的服务有兴趣,请及时和我们联系!

服务热线:18288888888
座机:18288888888
传真:
邮箱:888888@qq.com
地址:郑州市文化路红专路93号