参考:http://www.cnblogs.com/reynold-lei/p/3385290.html
http://www.cnblogs.com/feiling/p/3302242.html
罗马数字共有7个,即I(1)、V(5)、X(10)、L(50)、C(100)、D(500)和M(1000)。
- 在较大的罗马数字的右边记上较小的罗马数字,表示大数字加小数字。
- 在较大的罗马数字的左边记上较小的罗马数字,表示大数字减小数字。
- 左减的数字有限制,仅限于I、X、C。比如45不可以写成VL,只能是XLV
- 但是,左减时不可跨越一个位数。比如,99不可以用IC()表示,而是用XCIX()表示。(等同于阿拉伯数字每位数字分别表示。)
- 左减数字必须为一位,比如8写成VIII,而非IIX。
- 右加数字不可连续超过三位,比如14写成XIV,而非XIIII。
所以可能出现的数字只有: 1000(<4) M, 900(<2) CM, 500(<2) D, 400(<2) CD, 100(<4) C, 90(<2) XC, 50(<2) L, 40(<2) XL, 10(<4) X, 9(<2) IX, 5(<2) V, 4(<2) IV, 1(<4) I
只有M, C, X, I 可能出现多次。从左往右执行,则可得到答案。
public class Solution { public String intToRoman(int num) { // IMPORTANT: Please reset any member data you declared, as // the same Solution instance will be reused for each test case. StringBuffer result = new StringBuffer(); String[][] mapping = { {"", "M", "MM", "MMM", "", "", "", "", "", ""}, // 0 -3000 {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"}, // 100 - 900 {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"}, // 10 -90 {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"} // 0- 9 }; int scale = 1000; int i = 0; while(num > 0){ int digit = num / scale; result.append(mapping[i++][digit]); num = num % scale; scale /= 10; } return result.toString(); } }