罗马数字需要掌握的规则:
- 基本数字I、X、C中的任何一个,自身连用构成数目,或者放在大数的右边连用构成数目,都不能超过三个;放在大数的左边只能用一个。
- 不能把基本数字V、L、D中的任何一个作为小数放在大数的左边采用相减的方法构成数目;放在大数的右边采用相加的方式构成数目,只能使用一个。
- V和X左边的小数字只能用I,且只能有1个。
- L和C左边的小数字只能用X,且只能有1个。
- D和M左边的小数字只能用C,且只能有1个。
方法1:
class Solution {
public:
string intToRoman(int num) {
vector<string> Roman={"I","V","X","L","C","D","M"};
vector<int> dig={1,5,10,50,100,500,1000};
string tmp="";
int n=dig.size();
int i=n-1;
while(num!=0&&i>=0)
{
if(num/dig[i]!=0)
{
tmp+=Roman[i];
num-=dig[i];
}
else
{
if(dig[i]==10||dig[i]==100||dig[i]==1000)
{
if(dig[i]-dig[i-2]<=num)
{
num-=(dig[i]-dig[i-2]);
tmp+=Roman[i-2];
tmp+=Roman[i];
}
}
else
{
if(i>0&&dig[i]-dig[i-1]<=num)
{
num-=(dig[i]-dig[i-1]);
tmp+=Roman[i-1];
tmp+=Roman[i];
}
}
i--;
}
}
return tmp;
}
};
方法2:
经过归纳,可以总结为1,4,5,9四种情况
class Solution {
public:
string intToRoman(int num) {
vector<string> Roman={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
vector<int> dig={1000,900,500,400,100,90,50,40,10,9,5,4,1};
int n=dig.size();
int i,j,k;
string tmp="";
for(i=0;i<n;i++)
{
for(j=0,k=num/dig[i];j<k;j++)
tmp+=Roman[i];
num=num%dig[i];
}
return tmp;
}
};