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