跳转至

12. Integer to Roman

Leetcode

Given an integer, convert it to a roman numeral.

Input is guaranteed to be within the range from 1 to 3999.

class Solution:
    def intToRoman(self, num):
        """
        :type num: int
        :rtype: str
        """
        values = [ 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 ]
        numerals = [ "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" ]
        ret = ''
        for i in range(0, len(values)):
            while num >= values[i]:
                num -= values[i]
                ret += numerals[i]
        return ret

分析

罗马数字的计数方法:

罗马字符    I   V   X   L   C   D   M
整数数字    1   5   10  50  100 500 1000
计数规则:

  • 相同的数字连写,所表示的数等于这些数字相加得到的数,例如:III = 3
  • 小的数字在大的数字右边,所表示的数等于这些数字相加得到的数,例如:VIII = 8
  • 小的数字,限于(I、X和C)在大的数字左边,所表示的数等于大数减去小数所得的数,例如:IV = 4
  • 正常使用时,连续的数字重复不得超过三次
  • 在一个数的上面画横线,表示这个数扩大1000倍(本题只考虑3999以内的数,所以用不到这条规则)

罗马数字可以分为1、4、5、9这四种构成方式,而1-3999中,共有1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1,共计13种,依次分别对应"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
罗马数字  M    CM  D   CD  C   XC L  XL X  IX V IV I