思路
-
計算數字的位數:
- 通過
while(x)
循環計算輸入數字num
的位數n
。
- 通過
-
提取各位數字:
- 將數字
num
的每一位分解并存儲到nums
數組中,順序為從高位到低位。
- 將數字
-
羅馬數字映射:
- 使用固定數組
Roman
存儲羅馬數字符號:
對應關系:Roman = {'I', 'V', 'X', 'L', 'C', 'D', 'M'}
I=1
,V=5
,X=10
,L=50
,C=100
,D=500
,M=1000
。
- 使用固定數組
-
逐位轉換:
- 從最高位到最低位依次處理每一位數字:
- 普通情況(非4、非9):
- 如果數字
<5
,直接累加對應符號(如3 → III
)。 - 如果數字
≥5
,先加5
的符號,再加剩余部分(如7 → V + II = VII
)。
- 如果數字
- 特殊情況(4或9):
4
的規則:當前符號 + 下一個符號
(如4 → IV
)。9
的規則:當前符號 + 下兩個符號
(如9 → IX
)。
- 普通情況(非4、非9):
- 從最高位到最低位依次處理每一位數字:
-
符號索引計算:
- 通過
count
(當前位數)計算符號在Roman
中的索引:- 個位:
count=1
,符號索引0 (I)
,1 (V)
,2 (X)
。 - 十位:
count=2
,符號索引2 (X)
,3 (L)
,4 (C)
。 - 百位:
count=3
,符號索引4 (C)
,5 (D)
,6 (M)
。 - 千位:
count=4
,符號索引6 (M)
。
- 個位:
- 通過
class Solution {
public:string intToRoman(int num) {int n=0;int x=num;string s;char Roman[]={'I','V','X','L','C','D','M'};while(x){ n++;x/=10;}vector<int> nums(n,0);for(int i=n-1;i>=0;i--){nums[i]=num%10;num/=10;}int count=n;for(int i=0;i<n;i++){ if(nums[i]!=4&&nums[i]!=9){if(nums[i]<5) { int cnt=nums[i];while(cnt--){s+=Roman[2*(count-1)];}}else{s+=Roman[2*count-1];int cnt=nums[i]-5;while(cnt--){s+=Roman[2*(count-1)];}}}else if(nums[i]==4){s+=Roman[2*count-2];s+=Roman[2*count-1];}else{s+=Roman[2*count-2];s+=Roman[2*count];}count--;}return s;}
};