package com.interview.misc; /** * Convert a roman number to decimal number * Test cases: smaller number appearing before bigger number unless it is representing one less. * VL is incorrect since XL should be used to represent 90 * chars not used in roman representation is used * http://www.onlineconversion.com/roman_numerals_advanced.htm * */ public class RomanNumberToDecimal { public String converToRoman(int decimal){ StringBuffer buffer = new StringBuffer(); while(decimal > 0){ decimal = literal(decimal,buffer); } return buffer.toString(); } public int convertToDecimal(char[] roman){ int decimal = 0; for(int i=0; i < roman.length; ){ if(i < roman.length-1 && literal(roman[i]) < literal(roman[i+1])){ decimal += literal(roman[i+1]) - literal(roman[i]); i += 2; }else{ decimal += literal(roman[i]); i++; } } return decimal; } private int literal(int decimal,StringBuffer buffer){ if(decimal >= 1000){ buffer.append("M"); decimal -= 1000; return decimal; } else if(decimal >= 900){ buffer.append("CM"); decimal -= 900; return decimal; } else if(decimal >= 500){ buffer.append("D"); decimal -= 500; return decimal; } else if(decimal >= 400){ buffer.append("CD"); decimal -= 400; return decimal; } else if(decimal >= 100){ buffer.append("C"); decimal -= 100; return decimal; } else if(decimal >= 90){ buffer.append("XC"); decimal -= 90; return decimal; } else if(decimal >= 50){ buffer.append("L"); decimal -= 50; return decimal; } else if(decimal >= 40){ buffer.append("XL"); decimal -= 40; return decimal; } else if(decimal >= 10){ buffer.append("X"); decimal -= 10; return decimal; }else if(decimal >= 9){ buffer.append("IX"); decimal -= 9; return decimal; } else if(decimal >=5){ buffer.append("V"); decimal -= 5; return decimal; }else if(decimal >= 4){ buffer.append("IV"); decimal -= 4; return decimal; }else { buffer.append("I"); decimal -= 1; return decimal; } } private int literal(char ch){ switch(ch){ 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 : throw new IllegalArgumentException(); } } public static void main(String args[]){ RomanNumberToDecimal rnd = new RomanNumberToDecimal(); System.out.println(rnd.convertToDecimal("XX".toCharArray())); System.out.println(rnd.convertToDecimal("XCIX".toCharArray())); System.out.println(rnd.convertToDecimal("MLXIX".toCharArray())); System.out.println(rnd.convertToDecimal("MMDXLIII".toCharArray())); System.out.println(rnd.converToRoman(20)); System.out.println(rnd.converToRoman(99)); System.out.println(rnd.converToRoman(1069)); System.out.println(rnd.converToRoman(2543)); } }