[LeetCode]Integer to Roman

题目描述

Given an integer, convert it to a roman numeral.

Input is guaranteed to be within the range from 1 to 3999.

将阿拉伯数字转换为罗马数字,给你的数字范围是1之3999.

解题思路

必须将罗马数字及其构造规则说明一下:

在罗马数字中, 利用7个不同字母进行重复或者组合来表达各式各样的数字.
I = 1 
V = 5 
X = 10 
L = 50 
C = 100 
D = 500 
M = 1000

下面是关于构造罗马数字的一些通用的规则的介绍:
1>  字符是叠加的. I表示1, II表示2, 而III表示3. VI表示6(字面上为逐字符相加, "5加1"), VII表示7, VIII表示8. 
2>  能够被10整除的字符(I, X, C, 和M)至多可以重复三次. 对于4, 你则需要利用下一个最大的能够被5整除的字符进行减操作得到, 你不能把4表示成IIII; 而应表示为IV(比5小1). 数字40写成XL(比50小10), 41写成XLI, 42写成XLII, 43写成XLIII, 而44写成XLIV(比50小10, 然后比5小1).
3>  类似的, 对于数字9, 你必须利用下一个能够被10整除的字符进行减操作得到: 8表示为VIII, 而9则表示为IX(比10小1), 而不是VIIII(因为字符I不能连续重复四次). 数字90表示为XC, 900表示为CM.
4>  被5整除的字符不能重复. 数字10常表示为X, 而从来不用VV来表示. 数字100常表示为C, 也从来不表示为LL. 
5>  罗马数字经常从高位到低位书写, 从左到右阅读, 因此不同顺序的字符意义大不相同. DC表示600; 而CD是一个完全不同的数字(为400, 也就是比500小100). CI表示101; 而IC甚至不是一个合法的罗马字母(因为你不能直接从数字100减去1; 比需要写成XCIX, 意思是比100小10, 然后加上数字9, 也就是比10小1的数字).

通过上述规则,我们可以得到,在可表示范围以内的数字均是由 {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 }来组成,即罗马数字由 {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" }来组成,得到这两个数组至关重要。接下来获取罗马数字就顺理成章了。

代码

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值