羅馬數字和整數相互轉換


整數轉換成羅馬數字:

羅馬數字的基本型為:I=1,V=5,X=10,L=50,C=100,D=500,M=1000,相同的羅馬數字最多不能超過三個。所以對於4只能表示為5-1即IV,左減右加。

同理,9=IX,40=XL,90=XC,400=CD,900=CM。根據這些基本型,可以通過貪心算法,每次匹配最大值得到羅馬數字.

     //整數轉化成羅馬數字
    //貪心算法,每次取匹配最大值
    public static String intToRoman(int number) {
        int[] base = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
        String[] str = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX",
                "V", "IV", "I" };
        String roman = "";
        int i = 0;
        while (number != 0) {
            if (number >= base[i]) {
                number -= base[i];
                roman += str[i];
            } else
                i++;
        }
        return roman;
    }

羅馬數字轉換成整數:

首先要來了解一下羅馬數字表示法,基本字符有7個:I,V,X,L,C,D,M,分別表示1,5,10,50,100,500,1000。

在構成數字的時候,有下列規則:

1、相同的數字連寫,所表示的數等於這些數字相加得到的數,如:Ⅲ = 3;

2、小的數字在大的數字的右邊,所表示的數等於這些數字相加得到的數, 如:Ⅷ = 8;Ⅻ = 12;

3、小的數字,(限於Ⅰ、X 和C)在大的數字的左邊,所表示的數等於大數減小數得到的數,如:Ⅳ= 4;Ⅸ= 9;

4、正常使用時,連寫的數字重復不得超過三次。

 

    //羅馬數字轉化成整數
    public static int romanToInt(String s) {
        if (s.length() < 1)
            return 0;
        int result = 0;
        int sub = getRomanValue(s.charAt(0));
        int lastv = sub;
        for (int i = 1; i < s.length(); ++i) {
            char curc = s.charAt(i);
            int curv = getRomanValue(curc);
            if (curv == lastv)
                sub += curv;
            // 當前一個字符大於當前字符時,情況比較特殊,這個時候,只能講last包括last的字符算在sub內,相加得到result,
            // 至於curr還需要根據curr后面的字符判斷
            else if (curv < lastv) {
                result += sub;
                sub = curv;
            } else {
                sub = curv - sub;
            }
            lastv = curv;
        }
        result += sub;
        return result;
    }

    public static int getRomanValue1(char c) {
        Map<Character, Integer> map = new HashMap<>();
        map.put('I', 1);
        map.put('V', 5);
        map.put('X', 10);
        map.put('L', 50);
        map.put('C', 100);
        map.put('D', 500);
        map.put('M', 1000);
        return map.get(c);

    }

    public static int getRomanValue(char c) {
        switch (c) {
        case 'I':
            return 1;
        case 'V':
            return 5;
        case 'X':
            return 10;
        case 'L':
            return 50;
        case 'C':
            return 100;
        case 'D':
            return 500;
        case 'M':
            return 1000;
        default:
            return 0;
        }
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM