回复 37# yestreenstars
刚开始学,不太精通,勉强啊
- #!/usr/bin/python2
- ROM = [['I', 'V'], ['X', 'L'], ['C', 'D'], ['M']]
- GEN = lambda a, b, c, d, e, f, r: a * ROM[b][c] + d * ROM[e][f] + r
- LAM = [[3, lambda m, i, r: (0, i, 0, m, i, 0, r)],
- [4, lambda m, i, r: (1, i, 0, 5 - m, i, 1, r)],
- [5, lambda m, i, r: (0, i, 0, 1, i, 1, r)],
- [8, lambda m, i, r: (1, i, 1, m - 5, i, 0, r)],
- [9, lambda m, i, r: (10 - m, i, 0, 1, i + 1, 0, r)]]
- def A2R(n, i=0, R=''):
- if n is 0: return R
- n, m = divmod(n, 10)
- return A2R(n, i + 1, GEN(*next(l(m, i, R) for v, l in LAM if m <= v)))
- test = [1, 4, 5, 6, 9, 10, 11, 76, 499, 3888]
- good = ['I', 'IV', 'V', 'VI', 'IX', 'X', 'XI', 'LXXVI', 'CDXCIX', 'MMMDCCCLXXXVIII']
- for I, N in enumerate(test):
- rom = A2R(N)
- print N, '=', rom, ':', rom == good[I]
复制代码
- 1 = I : True
- 4 = IV : True
- 5 = V : True
- 6 = VI : True
- 9 = IX : True
- 10 = X : True
- 11 = XI : True
- 76 = LXXVI : True
- 499 = CDXCIX : True
- 3888 = MMMDCCCLXXXVIII : True
复制代码 |