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