- 题目:
字符 数值 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 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
- 解题思路:
我本来使用的是暴力解法,但是算法题要是使用暴力算法相当于是没做出来,参考了网上大神的代码之后才找到了这个解决方法。 首先是我们可以分析出所有的数字都是由1000,900,500,400,100,90,50,40,10,9,5,4,1来表示,然后罗马数字的特点是每一位都是尽量采用最大的数来表示,我们可以联想到每次减去这个数当前所能包含的这个数组中的最大的一个数来最为当前位的罗马数字,这样就能依次表示出这个数,能想出这个方法的大神真是太厉害了! - 解题代码:
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;
}
- tips:
string str13 = string("hello world",5)
引用大佬文章(写的很全面很好):
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
|