
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
