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