python整数和罗马数互转

1、整数转罗马数

num = int(12)
# 确定个十百千各自位置上的0~9对应罗马字母
c = {
    'g': ('', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX'),
    's': ('', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC'),
    'b': ('', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM'),
    'q': ('', 'M', 'MM', 'MMM')
}
roman = []
# 用整除和取余获得个十百千对应的数字
roman.append(c['q'][num // 1000])
roman.append(c['b'][(num // 100) % 10])
roman.append(c['s'][(num // 10) % 10])
roman.append(c['g'][num % 10])
print(199//10)
print(199//10%10)

2、罗马数转整数

#https://leetcode-cn.com/problems/roman-to-integer/
#罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
#字符          数值
#I             1
#V             5
#X             10
#L             50
#C             100
#D             500
#M             1000
#输入: "III" 输出: 3
#输入: "IV"输出: 4
#输入: "IX" 输出: 9
#输入: "LVIII" 输出: 58 解释: L = 50, V= 5, III = 3.
#输入: "MCMXCIV" 输出: 1994 解释: M = 1000, CM = 900, XC = 90, IV = 4.
#方法一
s = "IV"
d = {"I": 1, "V": 5, "X": 10, "L": 50, "C": 100, "D": 500, "M": 1000}
result = 0
for i in range(len(s)):
    if i < (len(s)-1) and d[s[i]] < d[s[i+1]]:
        result = result - d[s[i]]
    else:
        result = result + d[s[i]]
print(result)
#方法二
s = "MCMXCIV"
# M = 1000, CM = 900, XC = 90 and IV = 4
# 1994
result = 0
d = {"I": 1, "V": 5, "X": 10, "L": 50, "C": 100, "D": 500, "M": 1000}
dd = ["IV", "IX", "XL", "XC", "CD", "CM"]
for i in range(len(s)):
    print("qqqqqqqqqqqqqq",i,i+2,s[i:i + 2])
    if s[i:i + 2] in dd:
        result -= d[s[i]]
    else:
        result += d[s[i]]
print(result)

  

posted @ 2021-08-30 21:37  呆呆蒙蒙  阅读(223)  评论(0编辑  收藏  举报