筆記試験問題25.LeetCode OJ (12)
この問題の意味は整形数字をローマ数字に変換することであり、ローマ数字の構成特徴を理解すれば整形数字をローマ数字に変換する方法を知っている.
変換ルールは次のとおりです.
ビット数:
Ⅰ【1】 Ⅱ【2】 Ⅲ【3】 Ⅳ【4 】 Ⅴ【5 】 Ⅵ【6】 Ⅶ【7】 Ⅷ【8】 Ⅸ【9】
・10桁の例
Ⅹ【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」に関連する数字のところに「突然変異」が現れるのがローマ数字の特徴で、原則を身につけると次のようなコードが考えられがちです.
上のコードは長いですが、わかりやすく、それぞれの特殊な状況を個別に処理するのは望ましいでしょう.
変換ルールは次のとおりです.
ビット数:
Ⅰ【1】 Ⅱ【2】 Ⅲ【3】 Ⅳ【4 】 Ⅴ【5 】 Ⅵ【6】 Ⅶ【7】 Ⅷ【8】 Ⅸ【9】
・10桁の例
Ⅹ【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;
}
};
上のコードは長いですが、わかりやすく、それぞれの特殊な状況を個別に処理するのは望ましいでしょう.