解题思路:
罗马数字计数方法:1. 相同的数字连写,所表示的数等于这些数字相加得到的数,如:III=3;2. 小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数,如:VIII=8, XII=12;3. 小的数字在大的数字的左边(限于 IV、IX、XL、XC、CD和CM),所表示的数等于大数减小数得到的数,如:IV=4, IX=9;4. 正常使用时,连写的数字重复不得超过三次;
我们可以将所有减法操作看做一个整体,当成一种新的单位。从大到小整理所有单位得到
| M | CM | D | CD | C | XC | L | XL | X | IX | V | IV | I |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1000 | 900 | 500 | 400 | 100 | 90 | 50 | 40 | 10 | 9 | 5 | 4 | 1 |
- 我们可以将目标整数看成这些单位值的加和,且同一种单位不能使用超过3次,所以我们尽可能优先使用值较大的单位即可。
PHP代码实现:
class Solution {/*** @param Integer $num* @return String*/function intToRoman($num) {$value = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1];$str = ['M', 'CM', 'D', 'CD', 'C','XC', 'L', 'XL', 'X','IX', 'V', 'IV', 'I'];$roman = '';for ($i = 0; $i < count($value); $i ++) {while ($num >= $value[$i]) {$num -= $value[$i];$roman .= $str[$i];}}return $roman;}}
GO代码实现:
func intToRoman(num int) (roman string) {values := []int{1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}str := []string{"M", "CM", "D", "CD", "C","XC", "L", "XL", "X", "IX","V", "IV", "I"}for i:= 0; i < len(values); i++ {for num >= values[i] {num -= values[i];roman += str[i]}}return}

