筆記試験問題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」に関連する数字のところに「突然変異」が現れるのがローマ数字の特徴で、原則を身につけると次のようなコードが考えられがちです.
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;
    }
};

上のコードは長いですが、わかりやすく、それぞれの特殊な状況を個別に処理するのは望ましいでしょう.