题目:
Roman numerals are represented by seven different symbols: I
, V
, X
, L
, C
, D
and M
.
Symbol Value I 1 V 5 X 10 L 50 C 100 D 500 M 1000
For example, 2
is written as II
in Roman numeral, just two one's added together. 12
is written as XII
, which is simply X + II
. The number 27
is written as XXVII
, which is XX + V + II
.
Roman numerals are usually written largest to smallest from left to right. However, the numeral for four is not IIII
. Instead, the number four is written as IV
. Because the one is before the five we subtract it making four. The same principle applies to the number nine, which is written as IX
. There are six instances where subtraction is used:
I
can be placed beforeV
(5) andX
(10) to make 4 and 9.X
can be placed beforeL
(50) andC
(100) to make 40 and 90.C
can be placed beforeD
(500) andM
(1000) to make 400 and 900.
Given an integer, convert it to a roman numeral.
Example 1:
Input: num = 3 Output: "III"
Example 2:
Input: num = 4 Output: "IV"
Example 3:
Input: num = 9 Output: "IX"
Example 4:
Input: num = 58 Output: "LVIII" Explanation: L = 50, V = 5, III = 3.
Example 5:
Input: num = 1994 Output: "MCMXCIV" Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.
Constraints:
1 <= num <= 3999
思路:
这道题有点像是求数的分解,给定一个数,将它转换成罗马数字,比如58,我们是先得出50,然后得出5,最后得出3。按照这个思路,对于给定数字,我们只需要循环减去能减去的最大罗马数字即可。因此为罗马数字和阿拉伯数字同时设置“字典”,使他们一一对应,然后对于给定数字按照以上的逻辑进行削减,最后返回所得到的字符串即可。
代码:
class Solution {
public:
string intToRoman(int N) {
int val[13] = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
string rom[13] = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
string ans = "";
for (int i = 0; N; i++)
while (N >= val[i]) ans += rom[i], N -= val[i];
return ans;
}
};