LeetCode12

如果饿了就吃,困了就睡,渴了就喝,人生就太无趣了


题源:https://leetcode-cn.com/problems/integer-to-roman/

问题描述:整数转罗马数字

罗马数字包含以下七种字符: 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.

问题解析:

1.根据题目已知,分析1-10的罗马数字书写规律

阿拉伯数字 转换规则 罗马数字
1 根据已知 I
2 2=1+1 II
3 3=1+1+1 III
4 4特殊表示,已知已经告诉,4=5-1 IV
5 根据已知 V
6 5+1 VI
7 5+1+1 VII
8 5+1+1+1 VIII
9 9特殊表示,已知已经告诉,9=10-1 IX

2.因为本题的例子给出的输入最大值是3999,所以将特殊的数值和已知给出的表示方法进行整合。从大到小进行排列。

阿拉伯数字 罗马数字
1000 M
900 CM
500 D
400 CD
100 D
90 XC
50 L
40 XL
10 X
9 IX
5 V
4 IV
1 I

将表中的数据作为加法的因子,尽可能的挑选大的数字进行表示。这样表示出来的罗马数字最短。

代码(C)

char *intToRoman(int num) {
    struct hash {
        int interger;
        char *roman;
    } Hash[13] = {
            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",
    };
    char res[16] = {0x0};
    char *s = res;
    for (int i = 0; i < 13; i++) {
        for (; num >= Hash[i].interger;) {
            num = num - Hash[i].interger;
            strcat(res, Hash[i].roman);
        }
    }
    return s;
}

你可能感兴趣的:(LeetCode题库)