12. 整数转罗马数字
1.直接模拟
-
可以根据罗马数字的转换规则直接进行模拟,转换规则可以这样概括:
依次从1000,500,100,50,10,5,1中选出一个最大值,转换成对应字母,需要特殊处理900,400,90,40,9,4;
-
对应代码如下:
-
class Solution { public: string intToRoman(int num) { string result; while(num){ // cout<<num<<endl; if(num/1000>0){ result+="M"; num-=1000; }else if(num/500>0){ if(num/100==9){ result+="CM";//特殊处理900 num-=900; }else{ result+="D"; num-=500; } }else if(num/100>0){ if(num/100==4){ result+="CD";//特殊处理400 num-=400; }else{ result+="C"; num-=100; } }else if(num/50>0){ if(num/10==9){ result+="XC";//特殊处理90 num-=90; }else{ result+="L"; num-=50; } }else if(num/10>0){ if(num/10==4){ result+="XL";//特殊处理40 num-=40; }else{ result+="X"; num-=10; } }else if(num/5>0){ if(num==9){ result+="IX";//特殊处理9 num-=9; }else{ result+="V"; num-=5; } }else if(num>0){ if(num==4){ result+="IV";//特殊处理4 num-=4; }else{ result+="I"; num-=1; } } } return result; } };
2.硬编码
-
硬编码,将数据直接嵌入到程序的源代码中,将个、十、百、千位的所有情况罗列,根据每位数字直接对应出结果,一些数字处理问题中效果很好。
-
class Solution { public: string intToRoman(int num) { string result; string thousands[] = {"", "M", "MM", "MMM"}; string hundreds[] = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"}; string tens[] = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"}; string ones[] = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"}; result=thousands[num/1000]+hundreds[num%1000/100]+tens[num%100/10]+ones[num%10]; return result; } };