# 整数转罗马数字

罗马数字包含以下七种字符: I, V, X, LCD 和 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。这个特殊的规则只适用于以下六种情况:

给你一个整数,将其转为罗马数字。

 

示例 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.

 

提示:

以下错误的选项是?

## aop ### before ```c #include using namespace std; ``` ### after ```c int main() { Solution sol; cout << sol.intToRoman(1994) << endl; return 0; } ``` ## 答案 ```c class Solution { public: string intToRoman(int num) { int nums[13] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}; string romans[13] = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"}; string ans; int index = 0; while (index < 13) { while (num >= nums[index]) { num = nums[index]; ans = romans[index]; } index++; } return ans; } }; ``` ## 选项 ### A ```c class Solution { public: string getNum1000(int num1000) { if (num1000 == 3) { return "MMM"; } else if (num1000 == 2) { return "MM"; } else if (num1000 == 1) { return "M"; } else { return ""; } } string getNum100(int num100) { switch (num100) { case 1: return "C"; case 2: return "CC"; case 3: return "CCC"; case 4: return "CD"; case 5: return "D"; case 6: return "DC"; case 7: return "DCC"; case 8: return "DCCC"; case 9: return "CM"; default: return ""; } } string getNum10(int num10) { switch (num10) { case 1: return "X"; case 2: return "XX"; case 3: return "XXX"; case 4: return "XL"; case 5: return "L"; case 6: return "LX"; case 7: return "LXX"; case 8: return "LXXX"; case 9: return "XC"; default: return ""; } } string getNum1(int num1) { switch (num1) { case 1: return "I"; case 2: return "II"; case 3: return "III"; case 4: return "IV"; case 5: return "V"; case 6: return "VI"; case 7: return "VII"; case 8: return "VIII"; case 9: return "IX"; default: return ""; } } string intToRoman(int num) { int num1000 = num / 1000; int num100 = (num % 1000) / 100; int num10 = (num % 100) / 10; int num1 = (num % 10); string res; res = getNum1000(num1000) + getNum100(num100) + getNum10(num10) + getNum1(num1); return res; } }; ``` ### B ```c class Solution { public: string intToRoman(int num) { int values[13] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}; string reps[13] = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"}; string res; for (int i = 0; i < 13; i++) { while (num >= values[i]) { num -= values[i]; res += reps[i]; } } return res; } }; ``` ### C ```c class Solution { public: string intToRoman(int num) { string bit1[10] = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"}; string bit10[10] = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"}; string bit100[10] = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"}; string bit1000[4] = {"", "M", "MM", "MMM"}; return bit1000[num / 1000] + bit100[num % 1000 / 100] + bit10[num % 100 / 10] + bit1[num % 10]; } }; ```