Integer to Roman
1. 题目
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, two is written as II
in Roman numeral, just two one's added together. Twelve is written as, XII
, which is simply X
+ II
. The number twenty seven 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. Input is guaranteed to be within the range from 1 to 3999.
Example 1:
Input: 3
Output: "III"
Example 2:
Input: 4
Output: "IV"
Example 3:
Input: 9
Output: "IX"
Example 4:
Input: 58
Output: "LVIII"
Explanation: C = 100, L = 50, XXX = 30 and III = 3.
Example 5:
Input: 1994
Output: "MCMXCIV"
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.
2. 分析
这题的有关的另外一道题:
https://blog.youkuaiyun.com/qq_36124194/article/details/82825020
他们之间刚好是逆过来的,不过从阿拉伯数字到罗马数字的转化要难一些
这里我们采取的策略是将一些比较特殊的表示,例如4,9,40,90,400,900等都表示出来,然后通过条件判断了将他们匹配,除此之外,我们首先将int类型的数字分解,将分解得到的数据压进栈中,转化的时候将他们一一出栈,再进一步分解。
3. 源码
class Solution {
public:
string intToRoman(int num) {
int temp = num;
string result;
stack<int> s;
map<int, string> m;
m[1] = "I";
m[5] = "V";
m[10] = "X";
m[50] = "L";
m[100] = "C";
m[500] = "D";
m[1000] = "M";
m[4] = "IV";
m[9] = "IX";
m[40] = "XL";
m[90] = "XC";
m[400] = "CD";
m[900] = "CM";
int count = 10;
while(temp) {
temp /= 10;
int re = num%count;
s.push(re);
num = num - re;
count *= 10;
}
count /= 100;
while(!s.empty()) {
int num = s.top();
//cout << num << endl;
s.pop();
int remain = num/count;
//cout << "r count " << remain << " " << count << endl;
if(remain >= 1 && remain < 4) {
for(int i = 0; i < remain; i++) {
result.insert(result.size(),m[count]);
}
} else if(remain == 4||remain == 5||remain == 9) {
result.insert(result.size(),m[num]);
} else if(remain == 0) {
}else {
int n = 5*count;
result.insert(result.size(),m[n]);
remain = remain - 5;
for(int i = 0; i < remain; i++) {
result.insert(result.size(),m[count]);
}
}
count /= 10;
}
return result;
}
};
## [更多技术博客](https://vilin.club/):https://vilin.club/