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:
输入: num = 3 输出: "III"
示例 2:
输入: num = 4 输出: "IV"
示例 3:
输入: num = 9 输出: "IX"
示例 4:
输入: num = 58 输出: "LVIII" 解释: L = 50, V = 5, III = 3.
示例 5:
输入: num = 1994 输出: "MCMXCIV" 解释: M = 1000, CM = 900, XC = 90, IV = 4.
提示:
1 <= num <= 3999
题解
要将整数转换为罗马数字,我们可以遵循罗马数字的构成规则。罗马数字由七个不同的符号组成:I, V, X, L, C, D, M。每个符号代表一个特定的值,如 I 代表 1,V 代表 5 等。罗马数字通常从左到右写成从大到小的顺序。但也存在例外,特定的小数字置于大数字的左边用以表示减法,如 IV 表示 4,IX 表示 9。
对于任意给定的整数,我们可以从最大的符号 M(1000)开始,逐渐降低到最小的符号 I(1),并在每一步中确定该符号在罗马数字中可以出现多少次。在这个过程中,我们也需要考虑上述提到的减法规则。下面是一个实现这一过程的方法:
- 准备一个包含所有可能的罗马数字符号及其对应整数值的列表。这个列表应该按照符号对应的整数值从大到小排序,并且包括像 IV(4),IX(9),XL(40)这样的组合符号。
- 对于给定的整数 num,从列表的最开始(最大符号)迭代,每次尽可能多地从 num 中减去当前符号的整数值,直到 num 为 0。
- 每次减去一个符号的值,就将该符号添加到最终的罗马数字字符串中。
以示例 1994 为例,其转换过程如下:
- M(1000)小于等于 1994,所以我们添加 M 到结果中,并从 1994 减去 1000,得到 994。
- CM(900)小于等于 994,所以我们添加 CM,并从 994 减去 900,得到 94。
- XC(90)小于等于 94,所以我们添加 XC,并从 94 减去 90,得到 4。
- IV(4)等于 4,所以我们添加 IV,并从 4 减去 4,得到 0。
- 此时 num 变为 0,过程结束。
最终的罗马数字字符串为 “MCMXCIV”。
下面是一个实现这一过程的 C++ 示例代码:
#include <string>
#include <vector>
using namespace std;string intToRoman(int num) {vector<pair<int, string>> values = {{1000, "M"}, {900, "CM"}, {500, "D"}, {400, "CD"},{100, "C"}, {90, "XC"}, {50, "L"}, {40, "XL"},{10, "X"}, {9, "IX"}, {5, "V"}, {4, "IV"}, {1, "I"}};string result;for (auto &[value, symbol] : values) {while (num >= value) {num -= value;result += symbol;}}return result;
}
此代码遍历 values
列表,每次从 num
中减去尽可能多的当前符号的值,并将相应的罗马数字符号添加到结果字符串中,直到 num
变为 0。