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 到 3999 的范围内。

示例 1:

输入: 3
输出: "III"

示例 2:

输入: 4
输出: "IV"

示例 3:

输入: 9
输出: "IX"

示例 4:

输入: 58
输出: "LVIII"
解释: L = 50, V = 5, III = 3.

示例 5:

输入: 1994
输出: "MCMXCIV"
解释: M = 1000, CM = 900, XC = 90, IV = 4.

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/integer-to-roman
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

法一:

 1 public static String intToRoman(int num) {
 2         int ge = num % 10;
 3         String s1 = ge(ge);
 4         int shi = num / 10 % 10;
 5         String s2 = shi(shi);
 6         int bai = num / 100 % 10;
 7         String s3 = bai(bai);
 8         int qian = num / 1000 % 10;
 9         String s4 = qian(qian);
10         return s4+s3+s2+s1;
11     }
12 
13     private static String ge(int a) {
14         if (a == 4)
15             return "IV";
16         if (a == 9)
17             return "IX";
18         if (a <= 3) {
19             StringBuilder s = new StringBuilder();
20             for (int i = 0; i < a; i++) {
21                 s.append("I");
22             }
23             return s.toString();
24         }
25         if (a >= 5) {
26             StringBuilder s = new StringBuilder();
27             s.append("v");
28             int b = a - 5;
29             for (int i = 0; i < b; i++) {
30                 s.append("I");
31             }
32             return s.toString();
33         }
34         return null;
35     }
36 
37     private static String shi(int a) {
38         if (a == 4)
39             return "XL";
40         if (a == 9)
41             return "XC";
42         if (a <= 3) {
43             StringBuilder s = new StringBuilder();
44             for (int i = 0; i < a; i++) {
45                 s.append("X");
46             }
47             return s.toString();
48         }
49         if (a >= 5) {
50             StringBuilder s = new StringBuilder();
51             s.append("L");
52             int b = a - 5;
53             for (int i = 0; i < b; i++) {
54                 s.append("X");
55             }
56             return s.toString();
57         }
58         return null;
59     }
60 
61     private static String bai(int a) {
62         if (a == 4)
63             return "CD";
64         if (a == 9)
65             return "CM";
66         if (a <= 3) {
67             StringBuilder s = new StringBuilder();
68             for (int i = 0; i < a; i++) {
69                 s.append("C");
70             }
71             return s.toString();
72         }
73         if (a >= 5) {
74             StringBuilder s = new StringBuilder();
75             s.append("D");
76             int b = a - 5;
77             for (int i = 0; i < b; i++) {
78                 s.append("C");
79             }
80             return s.toString();
81         }
82         return null;
83     }
84 
85     private static String qian(int a){
86         StringBuilder s = new StringBuilder();
87         for (int i = 0; i < a; i++) {
88             s.append("M");
89         }
90         return s.toString();
91     }

依次取出各个位数,分情况讨论,再组合一起。

 

法二:

 1     public static String intToRoman(int num) {
 2         int[] ints = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
 3         String[] romans = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
 4         StringBuilder res = new StringBuilder();
 5         for (int i = 0; i < ints.length; i++) {
 6             while (num >= ints[i]) {
 7                 num -= ints[i];
 8                 res.append(romans[i]);
 9             }
10         }
11         return res.toString();
12     }

贪心算法是一种在当前时间做出最佳可能决策的算法;在这种情况下,它会取出最大可能的符号

posted @ 2020-06-27 22:20  陈糊糊啊  阅读(229)  评论(0)    收藏  举报