12. 整数转罗马数字

2024-01-01 15:43:45

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

  • 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

方法1:

    public static String intToRoman(int num) {
        int[] nums = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
        StringBuilder stringBuilder = new StringBuilder();
        while (num > 0){
            for (int i = 0; i < nums.length; ) {
                while (num >= nums[i]){
                    stringBuilder.append(toString(nums[i]));
                    num -= nums[i];
                }
                i++;
            }
        }
        return stringBuilder.toString();
    }
    public static String toString(int num){
        switch (num){
            case 1000:
                return "M";
            case 900:
                return "CM";
            case 500:
                return "D";
            case 400:
                return "CD";
            case 100:
                return "C";
            case 90:
                return "XC";
            case 50:
                return "L";
            case 40:
                return "XL";
            case 10:
                return "X";
            case 9:
                return "IX";
            case 5:
                return "V";
            case 4:
                return "IV";
            case 1:
                return "I";
        }
        return "";
    }

方法2:

    public String intToRoman(int num) {
        StringBuilder sb = new StringBuilder();
        int remains = num;
        while (remains > 0) {
            if (remains >= 1000) {
                sb.append('M');
                remains -= 1000;
            } else if (remains >= 100) {
                if (remains >= 900) {
                    sb.append("CM");
                    remains -= 900;
                } else if (remains >= 500) {
                    sb.append('D');
                    remains -= 500;
                } else if (remains >= 400) {
                    sb.append("CD");
                    remains -= 400;
                } else {
                    sb.append('C');
                    remains -= 100;
                }
            } else if (remains >= 10) {
                if (remains >= 90) {
                    sb.append("XC");
                    remains -= 90;
                } else if (remains >= 50) {
                    sb.append('L');
                    remains -= 50;
                } else if (remains >= 40) {
                    sb.append("XL");
                    remains -= 40;
                } else {
                    sb.append('X');
                    remains -= 10;
                }
            } else {
                if (remains >= 9) {
                    sb.append("IX");
                    remains -= 9;
                } else if (remains >= 5) {
                    sb.append('V');
                    remains -= 5;
                } else if (remains >= 4) {
                    sb.append("IV");
                    remains -= 4;
                } else {
                    sb.append('I');
                    remains -= 1;
                }
            }
        }
        return sb.toString();
    }

方法3:

    int[] values = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
    String[] symbols = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};

    public String intToRoman(int num) {
        StringBuffer roman = new StringBuffer();
        for (int i = 0; i < values.length; ++i) {
            int value = values[i];
            String symbol = symbols[i];
            while (num >= value) {
                num -= value;
                roman.append(symbol);
            }
            if (num == 0) {
                break;
            }
        }
        return roman.toString();
    }

文章来源:https://blog.csdn.net/linping_wong/article/details/135325003
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。