1. 具體題目數組
羅馬數字包含如下七種字符: I, V, X, L,C,D 和 M。app
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如, 羅馬數字 2 寫作 II ,即爲兩個並列的 1。12 寫作 XII ,即爲 X + II 。 27 寫作 XXVII, 即爲 XX + V + II 。spa
一般狀況下,羅馬數字中小的數字在大的數字的右邊。但也存在特例,例如 4 不寫作 IIII,而是 IV。數字 1 在數字 5 的左邊,所表示的數等於大數 5 減少數 1 獲得的數值 4 。一樣地,數字 9 表示爲 IX。這個特殊的規則只適用於如下六種狀況:code
I 能夠放在 V (5) 和 X (10) 的左邊,來表示 4 和 9。
X 能夠放在 L (50) 和 C (100) 的左邊,來表示 40 和 90。
C 能夠放在 D (500) 和 M (1000) 的左邊,來表示 400 和 900。
給定一個整數,將其轉爲羅馬數字。輸入確保在 1 到 3999 的範圍內。component
示例 1: 輸入: 3 輸出: "III"blog
示例 2: 輸入: 4 輸出: "IV"字符串
示例 3: 輸入: 9 輸出: "IX"class
示例 4: 輸入: 58 輸出: "LVIII" 解釋: L = 50, V = 5, III = 3.循環
示例 5: 輸入: 1994 輸出: "MCMXCIV" 解釋: M = 1000, CM = 900, XC = 90, IV = 4.di
2. 思路分析
從高位到低位依次判斷,按從大到小的順序對每一個結點數(包括900、400、90、40、九、4)作除法、將相應的字符加入字符串,取餘數,重複上述三步直到獲得最終結果爲止。
對於每一個結點數其實須要作的事情是相同的,只是數字大小和對應的字符不一樣,爲了避免重複類似的代碼,因此考慮將除數和字符存入數組中,用循環結構解決該問題。
3.代碼
1 public String intToRoman(int num) { 2 StringBuffer res = new StringBuffer(); 3 int[] div = {1000,900,500,400,100,90,50,40,10,9,5,4,1}; 4 String[] component = {"M","CM","D","CD","C","XC","L","XL","X", 5 "IX","V","IV","I"}; 6 for(int i = 0; i < div.length; i++){ 7 int count = num / div[i]; 8 while(count > 0){ 9 res.append(component[i]); 10 count--; 11 } 12 num = num % div[i]; 13 } 14 return res.toString(); 15 }