整数转罗马数字的三种思路及JAVA代码实现

package day04;

public class IntToRoman {
    public static void main(String[] args) {
        int num = 1994;//XXVIII
        //测试方法1
        //String res = intToRoman(num);
        //测试方法2
        String res = intToRomanByGreedy(num);
        System.out.println(res);
    }

    //思路1:从个位开始,一位一位的往前处理(如1994),并将每一个位上的数的大小分成[0,3],[4],[5,8],[9]这四部分处理
    public static String intToRoman(int num) {
        //                1   5   10  50  100  500 1000
        char [] chars = {'I','V','X','L','C','D', 'M'};// 0 0
        int base = 0;
        String res = "";
        while (num != 0){
            int temp = num % 10;
            num /= 10;
            String tmp = getRoman(temp,base,chars);
            res = tmp + res;
            base += 2;//现在处理到第几位0 个位,1 十位 ....

        }

        return res;
    }

    public static String getRoman(int i, int base, char[] chars) {
        //String tmp = "";
        StringBuffer sb = new StringBuffer();
       // StringBuilder stringBuilder = new StringBuilder();
        if(i <= 3){
            for(int j = 0; j < i; j++){
               sb.append(chars[base]);//如III
            }
            return sb.toString();

        } else if (i == 4) {
            String tmp = "" + chars[base] + chars[base + 1];//如IV
            return tmp;

        } else if(i >= 5 && i <= 8){
            sb.append(chars[base + 1]);//如 500 --》5 D
            for(int j = i - 5; j >= 1; j --) {//如600,DC
                sb.append(chars[base]);
            }

            return sb.toString();
        } else { // 9
            return "" + chars[base] + chars[base + 2]; // 如 900 --》 CM , 9 --> IX
        }

    }

    //思路2
    //优化,从上述代码可以看到,我们就是要找尽量最大的能表示该整数的罗马数字来替换-->贪心算法
    //因此我们只需要定义两个对应的数组并遍历它们
    public static String intToRomanByGreedy(int num) {
        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"};

        StringBuilder stringBuilder = new StringBuilder();//存储结果
        //每次都找最大能表示的,从左往右遍历
        for(int i = 0; i < values.length && num >= 0; i++) {
            while (values[i] <= num){
                num -= values[i];
                stringBuilder.append(symbols[i]);
            }

        }

        return stringBuilder.toString();
    }

    //思路3:整数(0-3999)转罗马数字,可以使用编码(应该个数有限)
    public static String intToRomanByCoding(int num) {

        String[] thousands = {"", "M", "MM", "MMM"};
        String[] hundreds = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};
        String[] tens = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};
        String[] ones = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};

        return thousands[num / 1000] + hundreds[num % 1000 / 100] + tens[num % 100 / 10] + ones[num % 10];
    }

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值