/**Given an integer, convert it to a roman numeral.Input is guaranteed to be within the range from 1 to 3999.题目大意:把一个整数变成罗马数字,输入数字是1-3999先恶补一下罗马数字相关知识: 最常见的罗马数字就是钟表的表盘符号: I, II, III, IV(也作IIII), V, VI, VII, VIII, IX, X, XI, XII... 1、基本字符: 1-I,5-V,10-X,50-L,100-C,500-D,1000-M 2、基本规则: a、相同的数字连写,所表示的数等于这些数字相加得到的数,如:Ⅲ = 3; b、小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数, 如:Ⅷ = 8;Ⅻ = 12; c、小的数字,(限于I、X 和C)在大的数字的左边,所表示的数等于大数减小数得到的数,如:Ⅳ= 4;Ⅸ= 9; d、正常使用时,连写的数字重复不得超过三次。(表盘上的四点钟“IIII”例外) e、在一个数的上面画一条横线,表示这个数扩大1000倍。 3、注意事项: a、基本数字Ⅰ、X 、C 中的任何一个,自身连用构成数目,或者放在大数的右边连用构成数目,都不能超过三个;放在大数的左边只能用一个。 b、不能把基本数字V 、L 、D 中的任何一个作为小数放在大数的左边采用相减的方法构成数目;放在大数的右边采用相加的方式构成数目,只能使用一个。 c、V 和X 左边的小数字只能用Ⅰ。 d、L 和C 左边的小数字只能用X。 e、D 和M 左边的小数字只能用C。 4、举例: a、个位数举例 Ⅰ,1 】Ⅱ,2】 Ⅲ,3】 Ⅳ,4 】Ⅴ,5 】Ⅵ,6】Ⅶ,7】 Ⅷ,8 】Ⅸ,9 】 b、十位数举例 Ⅹ,10】 Ⅺ,11 】ⅫII,13】 XIV,14】 XV,15 】XVI,16 】XVII,17 】XVIII,18】 XIX,19】 XX,20】 XXI,21 】XXII,22 】XX XXXIX,39】 XL,40】 L,50 】LI,51】 LV,55】 LX,60】 LXV,65】 LXXX,80】 XC,90 】XCIII,93】 XCV,95 】XCVIII,98】 XCIX,99 】 c、百位数举例 C,100】 CC,200 】CCC,300 】CD,400】 D,500 】DC,600 】DCC,700】 DCCC,800 】CM,900】 CMXCIX,999】 d、千位数举例 M,1000】 MC,1100 】MCD,1400 】MD,1500 】MDC,1600 】MDCLXVI,1666】 MDCCCLXXXVIII,1888 】MDCCCXCIX,1899 】 MCM,1900 】MCMLXXVI,1976】 MCMLXXXIV,1984】 MCMXC,1990 】MM,2000 】MMMCMXCIX,3999】 e、千位数以上 这个时候就要在字幕上面划横线了,纯字符没法表示**/public class Solution { public String intToRoman(int num) { //return solve1(num); return solve2(num); } //============================ solve1 ================================ //直接预存储个、十、百、千位所有的值 //如果要说有什么可以改进的话,最后那里形成result的地方别用加号,用StringBuffer或者StringBuilder private String solve1(int num){ String[] str3 = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"}; String[] str2 = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"}; String[] str1 = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"}; String[] str0 = {"", "M", "MM", "MMM"}; int num0 = num / 1000; num %= 1000; int num1 = num / 100; num %= 100; int num2 = num / 10; num %= 10; int num3 = num; String result = str0[num0] + str1[num1] + str2[num2] + str3[num3]; return result; } //============================ solve2 ================================ //这是另外一种方式,我觉得这两个差不多 //不过使用的字符串少了一些,方法更巧妙了,同样可以使用用StringBuffer或者StringBuilder进行加速 private String solve2(int num){ String result = ""; String[] str = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"}; int[] nums={1000,900,500,400,100,90,50,40,10,9,5,4,1}; int i = 0; while(num != 0){ if(num >= nums[i]){ num -= nums[i]; result += str[i]; }else{ i++; } } return result; }}