部分文章内容为公开资料查询整理,原文出处可能未标注,如有侵权,请联系我,谢谢。邮箱地址:gnivor@163.com ►►►需要气球么?请点击我吧!

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" };

 

posted @ 2015-07-15 16:17  流了个火  阅读(107)  评论(0)    收藏  举报
►►►需要气球么?请点击我吧!►►►
View My Stats