这道题的意思是将整形数字转化为罗马数字,只要了解了罗马数字的构成特点就知道怎么将整形数字转化为罗马数字,
转化规则如下:
个位数:
Ⅰ【1】 Ⅱ【2】 Ⅲ【3】 Ⅳ【4 】 Ⅴ【5 】 Ⅵ【6】 Ⅶ【7】 Ⅷ【8】 Ⅸ【9】
·十位数举例
Ⅹ【10】 Ⅺ【11】Ⅻ【12】 XIII【13】XIV【14】 XV【15】XVI【16】XVII【17】 XVIII【18】XIX【19】 XX【20】 XXI【21 】
XXII【22 】 XXIX【29】 XXX【30】 XXXIV【34】 XXXV【35】 XXXIX【39】 XL【40】 L【50】 LI【51】 LV【55】 LX【60】
LXV【65】LXXX【80】XC【90 】XCIII【93】 XCV【95】XCVIII【98】 XCIX【99】
·百位数举例
C【100】 CC【200 】CCC【300 】CD【400】 D【500】DC【600】DCC【700】 DCCC【800】CM【900】 CMXCIX【999】
千位数举例
M【1000】 MC【1100 】 MCD【1400 】 MD【1500】 MCM【1900】 MCMXC【1990】 MM【2000】 MMMCMXCIX【3999】
可以看出,和"4"和"9"相关的数字的地方都会出现“突变”,这就是罗马数字的特点,掌握了原则后我们很容易就会想到如下代码:
class Solution {
public:
string intToRoman(int num) {
// I(1) V(5) X(10) L(50) C(100) D(500) M(1000)
//范围 1~3999
string ret;
if(num < 1 || num > 3999)
{
return ret;
}
if(num >= 1000)
{
int numofM = num/1000;
for(int i=0; i < numofM ;++i)
{
ret.push_back('M');
}
num-=1000*numofM;
}
if(num >= 500)
{
if(num >=900)
{//CM(900)
ret+="CM";
num-=900;
}
else
{
ret.push_back('D');
num-=500;
}
}
if(num >= 100)
{
if(num >= 400)
{
ret+="CD";
num-=400;
}
else
{
int numofC = num/100;
for(int i=0;i<numofC;++i)
{
ret.push_back('C');
}
num-=numofC*100;
}
}
if(num >= 50)
{//XC(90)
if(num>=90)
{
ret+="XC";
num-=90;
}
else
{
ret.push_back('L');
num-=50;
}
}
if(num >= 10)
{
if(num >= 40)
{
ret+="XL";
num-=40;
}
else
{
int numofX = num/10;
for(int i = 0; i < numofX; ++i)
{
ret.push_back('X');
}
num-=10*numofX;
}
}
if(num >= 5)
{
if(num == 9)
{//9(IX)
ret+="IX";
num-=9;
}
else
{
ret.push_back('V');
num-=5;
}
}
if(num >= 1)
{
if(num == 4)
{//4(IV)
ret+="IV";
}
else
{
for(int i=0; i < num; ++i)
{
ret.push_back('I');
}
}
num=0;
}
return ret;
}
};
上面的代码虽然比较长,但是通俗易懂,对每种特殊情况进行单独处理,还是可取的吧~