Question:
Given an integer, convert it to a roman numeral.
Input is guaranteed to be within the range from 1 to 3999.
給你一個整數,把它轉化為羅馬數字,輸入保證在1到3999之間。
關於羅馬數字介紹:
1、計數方法:① 羅馬數字就有下面七個基本符號:Ⅰ(1)、Ⅴ(5)、Ⅹ(10)、L(50)、C(100)、D(500)、M(1000)。
② 相同的數字連寫,所表示的數等於這些數字相加得到的數,如:Ⅲ = 3;XX=20;CC=200;MMM=3000;
③ 小的數字在大的數字的右邊,所表示的數等於這些數字相加得到的數, 如:Ⅷ = 8;Ⅻ = 12;
④ 小的數字,(限於Ⅰ、X 和C)在大的數字的左邊,所表示的數等於大數減小數得到的數,如:Ⅳ= 4;Ⅸ= 9;
⑤ 正常使用時連寫的數字重復不得超過三次;
2、組數規則: ① 基本數字Ⅰ、X 、C 中的任何一個,自身連用構成數目,或者放在大數的右邊連用構成數目,都不能超過三個;放在大數的左邊只能用一個。
② 不能把基本數字V 、L 、D 中的任何一個作為小數放在大數的左邊采用相減的方法構成數目;放在大數的右邊采用相加的方式構成數目;
③ V 和X 左邊的小數字只能用Ⅰ。
④ L 和C 左邊的小數字只能用X。
⑤ D 和M 左邊的小數字只能用C。
3、對照舉例: ① 個位舉例:Ⅰ,1 】Ⅱ,2】 Ⅲ,3】 Ⅳ,4 】Ⅴ,5 】Ⅵ,6】Ⅶ,7】 Ⅷ,8 】Ⅸ,9 】
② 十位舉例:Ⅹ,10】 Ⅺ,11 】Ⅻ,12】 XXXV,35 】XXXIX,39】 XL,40】 L,50 】LI,51】 LV,55】 XC,90 】XCIII,93】 XCV,95 】XCVIII,98】
③ 百位舉例:C,100】 CC,200 】CCC,300 】CD,400】 D,500 】DC,600 】DCC,700】 DCCC,800 】CM,900】 CMXCIX,999】
④ 千位舉例:M,1000】 MC,1100 】MCD,1400 】MD,1500 】MDC,1600 】 MCMXC,1990 】MM,2000 】MMMCMXCIX,3999
算法基本思想: 這個題僅僅要求到3999比較簡單,根據羅馬數字的構建數字的規則,無論個位十位百位還是千位都有相同的構造方法,但是所表示的字母是不同的,所以我想到去寫一個函數,public String intToCharacter(int n,int i),n表示數位上的數字,i表示要轉化的整數從右到左第幾位,這個函數可以把單獨的數字轉化成羅馬字母,在public String intToRoman(int num) 函數中,傳入要轉化的整數num,然后依次從右向左取出各位,依次求相應羅馬數字,並進行字符串拼接,就能得到所需要的結果。
代碼實現(java):
1 class Solution { 2 public String intToRoman(int num) { 3 String str=""; 4 int i=1,n; //i表示從右到左整數第幾位 5 while(num>0){ 6 n=num%10; //表示數位上的數字 7 num/=10; 8 str=intToCharacter(n, i).concat(str); //把每一位返回的字符串和str相連 9 i++; 10 } 11 return str; 12 } 13 public String intToCharacter(int n,int i){//n表示特定的輸入,i表示個位十位百位或者千位 14 String str1,str2,str3;//拿0~9之間的數舉例,str1表示I,str2表示V,str3表示X 15 String str="";//這個函數返回特定位上的羅馬數字表示形式 16 if(1==i){ //下面if語句是判斷n是哪一位上的,依次用羅馬數字表示1、5、10 17 str1="I"; //個位上的數 18 str2="V"; 19 str3="X"; 20 } 21 else if(2==i){ 22 str1="X"; //十位上的數 23 str2="L"; 24 str3="C"; 25 }else if(3==i){ 26 str1="C"; //百位上的數 27 str2="D"; 28 str3="M"; 29 }else{ 30 str1="M"; //千位上的數,因為最大數到3999,所以str2和str3為空 31 str2=""; 32 str3=""; 33 } 34 switch(n){ //switch對各數字進行組合以個位上的數舉例如下 35 case 0:break; //空 36 case 1:str+=str1;break; //I 37 case 2:str+=str1+str1;break; //II 38 case 3:str+=str1+str1+str1;;break;//III 39 case 4:str+=str1+str2;break; //IV 40 case 5:str+=str2;break; //V 41 case 6:str+=str2+str1;break; //VI 42 case 7:str+=str2+str1+str1;break; //VII 43 case 8:str+=str2+str1+str1+str1;break; //VIII 44 case 9:str+=str1+str3;break; //IX 45 } 46 return str; 47 } 48 }