12. Integer to Roman

Roman numerals are represented by seven different symbols: 
I

V

X

L

C

D
 and 
M
.

Symbol       Value
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

For example, two is written as II in Roman numeral, just two one’s added together. Twelve is written as, XII, which is simply X + II. The number twenty seven is written as XXVII, which is XX + V + II.

Roman numerals are usually written largest to smallest from left to right. However, the numeral for four is not IIII. Instead, the number four is written as IV. Because the one is before the five we subtract it making four. The same principle applies to the number nine, which is written as IX. There are six instances where subtraction is used:

  • I can be placed before V (5) and X (10) to make 4 and 9. 
  • X can be placed before L (50) and C (100) to make 40 and 90. 
  • C can be placed before D (500) and M (1000) to make 400 and 900.

Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 to 3999.

Example 1:

Input: 3
Output: "III"

Example 2:

Input: 4
Output: "IV"

Example 3:

Input: 9
Output: "IX"

Example 4:

Input: 58
Output: "LVIII"
Explanation: C = 100, L = 50, XXX = 30 and III = 3.

Example 5:

Input: 1994
Output: "MCMXCIV"
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.

翻譯

羅馬數字包含以下七種字符: I, V, X, LCD 和 M

字符          數值
I             1
V             5
X             10
L             50
C             100
D             500
M             1000
  • I 可以放在 V (5) 和 X (10) 的左邊,來表示 4 和 9。
  • X 可以放在 L (50) 和 C (100) 的左邊,來表示 40 和 90。 
  • C 可以放在 D (500) 和 M (1000) 的左邊,來表示 400 和 900。

在左邊表示減掉這個數,在右邊表示相加,左邊只能有一個,更加詳盡的羅馬數字規則,如若上題沒有明白,請自行百度。

方法呢其實很簡單,直接貼代碼吧,出自LeetCode社區討論。思路也很簡單,不過雖然很簡單,但是老感覺這樣寫就有點失去了靈魂,不過確實是很簡單的寫法,否則就得寫一堆swith case

public static String intToRoman(int num) {
    String M[] = {"", "M", "MM", "MMM"};
    String C[] = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};
    String X[] = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};
    String I[] = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};
    return M[num/1000] + C[(num%1000)/100] + X[(num%100)/10] + I[num%10];
}

點擊查看更多解法

既然直接複製了LeetCode社區中的代碼,那麼自己再另外寫一份好了。

轉換羅馬數字,在國內用的還是挺少的,特別是這種大額的,但是將數字轉換漢字在一些行業應用就比較多了。那麼我們就試着將數字轉換爲漢字試試吧。

下面直接上代碼,思路就不多說了,和上面類似,挺簡單的。

    public String intToHanzi(long num) {
        String[] symbols = {"", "拾", "佰", "仟", "萬", "億"};
        String[] values = {"零", "壹", "貳", "叄", "肆", "伍", "陸", "柒", "捌", "玖"};
        String unit = "圓";
        long digit = 10;
        int i = 0;
        StringBuilder sb = new StringBuilder();
        long temp = num;
        do {
            int number = (int) (num % digit / (digit / 10));
            digit *= 10;
            temp /= 10;
            sb.append(getUnit(symbols, number, i));
            sb.append(values[number]);
            i++;
        }while (temp != 0);
        return sb.reverse().append(unit).toString();
    }

    private String getUnit(String[] symbols, int value, int i){
        if (value == 0) return "";
        if (i - 8 > 0){
            return symbols[i - 8];
        }else if (i - 8 == 0){
            return symbols[5];
        }else if (i - 4 > 0){
            return symbols[i - 4];
        }else {
            return symbols[i];
        }
    }

測試了一下,輸入”245812039L“進行轉換之後”貳億肆仟伍佰捌拾壹萬貳仟零叄拾玖圓“是不是以後讀數字再也不用先數位數,然後再讀出來了。

如果各位看官有更好的思路歡迎交流。

点赞