LeetCode--12. Integer to Roman
题目大意:给出一个数字,将数字转换为罗马数字(数字范围从1到3999)
罗马数字表示法:http://blog.sina.com.cn/s/blog_4eac4bf001018bxs.html
罗马数字就有下面七个基本符号:Ⅰ(1)、Ⅴ(5)、Ⅹ(10)、L(50)、C(100)、D(500)、M(1000)。
罗马数字记数规则:
(1)相同的数字连写,所表示的数等于这些数字相加得到的数,如:Ⅲ = 3;
(2)小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数, 如:Ⅷ = 8;Ⅻ = 12;
(3)小的数字,(限于Ⅰ、X 和C)在大的数字的左边,所表示的数等于大数减小数得到的数,如:Ⅳ= 4;Ⅸ= 9;
(4)正常使用时连写的数字重复不得超过三次。(表盘上的四点钟--“IIII”,例外。)
(5)在一个数的上面画一条横线,表示这个数扩大1000 倍。
罗马数字组数规则:
(1)基本数字Ⅰ、X 、C 中的任何一个,自身连用构成数目,或者放在大数的右边连用构成数目,都不能超过三个;放在大数的左边只能用一个。
(2)不能把基本数字V 、L 、D 中的任何一个作为小数放在大数的左边采用相减的方法构成数目;放在大数的右边采用相加的方式构成数目,只能使用一个。
(3)V 和X 左边的小数字只能用Ⅰ。
(4)L 和C 左边的小数字只能用X。
(5)D 和M 左边的小数字只能用C。
举例:
20表示为两个10,即XX。40表示为50减去10,即XL。95表示为100减去10加上5.即XCV.
400表示为500减去100,即CD。700表示为500加100夹100,即DCC。以此类。
方法1:分别讨论当前位数上的 x <=3 , x = 4 , 4<x<=8 , x = 9时的表示,每种代表一个类型
x<=3时,添加0到3个重复的字符
当x=4时,添加两个字符,分别表示5和1(其实就是5-1或者50-10或者500-50)
当4<x<=8, 添加0到3个重复的字符和1个表示下一位的字符(5+n*1或者50+n*10或者500+n*100)
当x=9时,添加两个字符,分别表示10和1(10-1,或者100-10,或者1000-100)
代码:注意由于字符是反向添加的,因此最后还要翻转过来。
public static String intToRoman(int num) { StringBuffer solu = new StringBuffer(); int x = 0 ; char[] roman = {'I','V','X','L','C','D','M'}; int rindex = 0; while(num!=0){ x =num%10; System.out.println(x); num=num/10; if(x<=3){ while(x!=0){ solu.append(roman[rindex]); x--; } } else if(x<=8){ if(x==4){ solu.append(roman[rindex+1]); solu.append(roman[rindex]); }else{ while(x-5!=0){ solu.append(roman[rindex]); x--; } solu.append(roman[rindex+1]); } }else{ solu.append(roman[rindex+2]); solu.append(roman[rindex]); } rindex+=2; } return solu.reverse().toString(); }
方法2:http://blog.sina.com.cn/s/blog_4eac4bf001018bxs.html
int[] values = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
String[] numerals = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };

浙公网安备 33010602011771号