思路
-
计算数字的位数:
- 通过
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;}
};