半个小时写完了代码,提交之后一遍过,这种感觉还是比较爽的。
题目描述
阿拉伯数字转罗马数字,符号与对应数值如下:
1 2 3 4 5 6 7 8
| Symbol Value I 1 V 5 X 10 L 50 C 100 D 500 M 1000
|
需要注意的是减法的情况(4和9)
解决思路
有限的几个字母,比较好处理,先将数字减至1000以下,这个过程中只用考虑M的个数;然后就可以按照位数,循环地处理剩下的数字了。对于剩下的数字,位数上数字为4和9的需要单独处理,剩下的就是字符串循环加,数字循环减。用k来表示此时处理到的基数,k=100,10,1.最后退出循环,返回字符串。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| string intToRoman(int num) { string res = ""; int remain = num; while ((remain / 1000) > 0) { res += "M"; remain -= 1000; } int k = 100; while (k > 0) { if ((remain / k) > 4) { if ((remain / k) == 9) { remain -= 9 * k; if (k == 100) res += "CM"; else if (k == 10) res += "XC"; else res += "IX"; } else { remain -= 5 * k; if (k == 100) res += "D"; else if (k == 10) res += "L"; else res += "V"; } } if ((remain / k) == 4) { remain -= 4*k; if (k == 100) res += "CD"; else if (k == 10) res += "XL"; else res += "IV"; } if ((remain / k) < 4) { while ((remain / k) > 0) { remain -= k; if (k == 100) res += "C"; else if (k == 10) res += "X"; else res += "I"; } } k /= 10; } return res; }
|