[LeetCode]43. Integer to Roman整数转罗马数字
Given an integer, convert it to a roman numeral.
Input is guaranteed to be within the range from 1 to 3999.
解法:与罗马数字转整数过程相反。例如数字2438,罗马数字表示为MM CD XXX VIII,即是每个分位上的数字分别用当前分位的基数表示即可。因为整数范围在[1,3999],不需要考虑数字上加横线的情况。每个分位上分几种情况:
(1)千位:1000-3000,分别为M、MM、MMM
(2)百位:100-300:C、CC、CCC;400:CD;500-800:D、DC、DCC、DCCC;900:CM
(3)十位:10-30:X、XX、XXX;40:XL;50-80:L、LX、LXX、LXXX;90:XC
(4)个位:1-3:I、II、III;4:IV;5-8:V、VI、VII、VIII;9:IX
因此使用最笨的办法,直接建表然后查表即可。
class Solution { public: string intToRoman(int num) { string romanTab[4][9] = { {"I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"}, {"X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"}, {"C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"}, {"M", "MM", "MMM"}, }; string res = ""; int i = 3; while (num > 0) { int dig = num / (int)pow(10, i); res = dig > 0 ? res + romanTab[i][dig - 1] : res; num %= (int)pow(10, i); --i; } return res; } };
或者根据上面的分析情况先取出每个分位上的数字,与4/8/9进行比较,然后确定每个分位的表示:
class Solution { public: string intToRoman(int num) { string roman[] = {"M", "D", "C", "L", "X", "V", "I"}; int value[] = {1000, 500, 100, 50, 10, 5, 1}; string res = ""; for(int i = 0; i < 7; i+= 2) { int dig = num / value[i]; //获得每个分位上的数字 //分四种情况考虑,注意千分位上数字最大为3 if(dig < 4) { for(int j = 0; j < dig; j++) res += roman[i]; } else if(dig == 4) res += roman[i] + roman[i - 1]; else if(dig > 4 && dig < 9) { res += roman[i - 1]; for(int j = 0; j < dig - 5; ++j) res += roman[i]; } else if(dig == 9) res += roman[i] + roman[i - 2]; num %= value[i]; } return res; } };