Liczby rzymskie i arabskie – przeliczanie (Java)

Czasami istnieje potrzeba przeliczania liczb rzymskich na arabskie i odwrotnie.
Można do tego celu użyć poniższych metod intToRoman i romanToInt.

Metody

    /**
     * Przekształca liczbę rzymską na liczbę dziesiętną
     * Zakłada się, że jest to poprawna liczba rzymska
     * @param roman String - liczba rzymska
     * @return int - zwraca int
     */
    public static int romanToInt(String roman) {
        int sum = 0;
        for(int i = 0; i < roman.length(); i++){
            if(roman.substring(i, i + 1).equals("M")){
                sum += 1000;
                if((i > 0) && (roman.substring(i - 1, i).equals("C"))){
                    sum -= 200;
                }
            }
            if(roman.substring(i, i + 1).equals("D")){
                sum += 500;
                if((i > 0) && (roman.substring(i - 1, i).equals("C"))){
                    sum -= 200;
                }
            }
            if(roman.substring(i, i + 1).equals("C")){
                sum += 100;
                if((i > 0) && (roman.substring(i - 1, i).equals("X"))){
                    sum -= 20;
                }
            }
            if(roman.substring(i, i + 1).equals("L")){
                sum += 50;
                if((i > 0) && (roman.substring(i - 1, i).equals("X"))){
                    sum -= 20;
                }
            }
            if(roman.substring(i, i + 1).equals("X")){
                sum += 10;
                if((i > 0) && (roman.substring(i - 1, i).equals("I"))){
                    sum -= 2;
                }
            }
            if(roman.substring(i, i + 1).equals("V")){
                sum += 5;
                if((i > 0) && (roman.substring(i - 1, i).equals("I"))){
                    sum -= 2;
                }
            }
            if(roman.substring(i, i + 1).equals("I")){
                sum += 1;
            }
        }
        return sum;
    }
    /**
     * przekształca liczbę dziesiętną na liczbę rzymską
     * zakłada się, że int nie przekracza zakresu dopuszczalnego
     * dla liczb rzymskich
     * @param dec int - liczba do przekształcenia
     * @return String - wynikowa liczba rzymska
     */
    public static String intToRoman(int dec) {
        int tys = dec / 1000;
        int set = (dec - tys * 1000) / 100;
        int dzies = (dec - tys * 1000 - set * 100) / 10;
        int jedn = (dec - tys * 1000 - set * 100 - dzies * 10);
        StringBuffer sb = new StringBuffer();
        switch(tys){
            case 0:
                break;
            case 1:
                sb.append("M");
                break;
            case 2:
                sb.append("MM");
                break;
            case 3:
                sb.append("MMM");
                break;
        }
        switch(set){
            case 0:
                break;
            case 1:
                sb.append("C");
                break;
            case 2:
                sb.append("CC");
                break;
            case 3:
                sb.append("CCC");
                break;
            case 4:
                sb.append("CD");
                break;
            case 5:
                sb.append("D");
                break;
            case 6:
                sb.append("DC");
                break;
            case 7:
                sb.append("DCC");
                break;
            case 8:
                sb.append("DCCC");
                break;
            case 9:
                sb.append("CM");
                break;
        }
        switch(dzies){
            case 0:
                break;
            case 1:
                sb.append("X");
                break;
            case 2:
                sb.append("XX");
                break;
            case 3:
                sb.append("XXX");
                break;
            case 4:
                sb.append("XL");
                break;
            case 5:
                sb.append("L");
                break;
            case 6:
                sb.append("LX");
                break;
            case 7:
                sb.append("LXX");
                break;
            case 8:
                sb.append("LXXX");
                break;
            case 9:
                sb.append("XC");
                break;
        }
        switch(jedn){
            case 0:
                break;
            case 1:
                sb.append("I");
                break;
            case 2:
                sb.append("II");
                break;
            case 3:
                sb.append("III");
                break;
            case 4:
                sb.append("IV");
                break;
            case 5:
                sb.append("V");
                break;
            case 6:
                sb.append("VI");
                break;
            case 7:
                sb.append("VII");
                break;
            case 8:
                sb.append("VIII");
                break;
            case 9:
                sb.append("IX");
                break;
        }
        return new String(sb);
    }
}
Wynik
        String rok = MathUtil.intToRoman(2018);
        System.out.println("rok rzymski: "+rok);
        int rok1 = MathUtil.romanToInt("rok: "+ rok);
        System.out.println(rok1);
rok rzymski: MMXVIII
2018

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *