Skip to content

Instantly share code, notes, and snippets.

@anatollupacescu
Last active May 31, 2017 14:58
Show Gist options
  • Save anatollupacescu/733c7b80e0188ade00b1b578965b56a9 to your computer and use it in GitHub Desktop.
Save anatollupacescu/733c7b80e0188ade00b1b578965b56a9 to your computer and use it in GitHub Desktop.
//initial
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class RomanNumerals {
@Test
public void test1() {
assertEquals(1, toNumber("I"));
assertEquals(2, toNumber("II"));
assertEquals(3, toNumber("III"));
assertEquals(4, toNumber("IV"));
assertEquals(5, toNumber("V"));
assertEquals(6, toNumber("VI"));
assertEquals(7, toNumber("VII"));
assertEquals(8, toNumber("VIII"));
assertEquals(9, toNumber("IX"));
assertEquals("X", toRoman(10));
assertEquals(10, toNumber("X"));
assertEquals("XXI", toRoman(21));
assertEquals(29, toNumber("XXIX"));
assertEquals(36, toNumber("XXXVI"));
assertEquals(49, toNumber("XLIX"));
assertEquals("XLIX", toRoman(49));
assertEquals("LXXI", toRoman(71));
assertEquals("MCMLIV", toRoman(1954));
assertEquals("CDLXXI", toRoman(471));
assertEquals("DCLXXI", toRoman(671));
assertEquals("MDCLXXI", toRoman(1671));
assertEquals("MCMLIV", toRoman(1954));
assertEquals(1954, toNumber("MCMLIV"));
assertEquals("MCMXC", toRoman(1990));
assertEquals(1990, toNumber("MCMXC"));
assertEquals(2014, toNumber("MMXIV"));
assertEquals("MMXIV", toRoman(2014));
assertEquals(1967, toNumber("MCMLXVII"));
assertEquals("MCMLXVII", toRoman(1967));
assertEquals("MMDCLXXI", toRoman(2671));
}
private int toNumber(String input) {
if(input.isEmpty()) return 0;
final String inputString = input;
int length = inputString.length();
int val;
while((val = fromRoman(inputString.substring(0, length))) == -1) {
length -= 1;
}
String tail = input.substring(length);
return val + toNumber(tail);
}
private String toRoman(int i) {
if(i <= 10) {
switch (i) {
case 1:
return "I";
case 2:
return "II";
case 3:
return "III";
case 4:
return "IV";
case 5:
return "V";
case 6:
return "VI";
case 7:
return "VII";
case 8:
return "VIII";
case 9:
return "IX";
case 10:
return "X";
}
} else if (i == 40) {
return "XL";
} else if (i <= 50) {
if(i == 50 ) return "L";
if(i > 40) return toRoman(40) + toRoman(i - 40);
return leftOrRight(i, "X", 10);
}else if (i == 90){
return "XC";
} else if (i <= 100) {
if (i == 100) return "C";
if(i > 90) return toRoman(90) + toRoman(i - 90);
return toRoman(50) + toRoman(i - 50);
} else if (i == 400) {
return "CD";
} else if (i <= 500) {
if (i == 500) return "D";
if(i > 400) return toRoman(400) + toRoman(i - 400);
return leftOrRight(i, "C", 100);
} else if (i == 900) {
return "CM";
} else if (i <= 1000) {
if(i == 1000) return "M";
if(i > 900) return "CM" + toRoman(i - 900);
return toRoman(500) + toRoman(i - 500);
}
return leftOrRight(i, "M", 1000);
}
private String leftOrRight(int num, String rom, int eur) {
int b = num / eur;
String head = "";
for(int j = 0; j < b; j++) {
head += rom;
}
int rest = b * eur;
return head + toRoman(num - rest);
}
private int fromRoman(String i) {
if(i.length() > 4) return -1;
switch (i) {
case "I": return 1;
case "II": return 2;
case "III": return 3;
case "IV": return 4;
case "V": return 5;
case "VI": return 6;
case "VII": return 7;
case "VIII": return 8;
case "IX": return 9;
case "X": return 10;
case "XX": return 20;
case "XXX": return 30;
case "XL": return 40;
case "L": return 50;
case "XC": return 90;
case "C": return 100;
case "CC": return 200;
case "CCC": return 300;
case "CD": return 400;
case "D": return 500;
case "CM": return 900;
case "M": return 1000;
default:
return -1;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment