罗马数字转换程序

罗马数字转换器
部署运行你感兴趣的模型镜像

在一本书里看到一段罗马数字的程序, 需求如下,自己试着用python和erlang各写了一遍,感觉有些地方还是不太舒服,大家看看这个程序还能怎么改改更好

你可能经常看到罗马数字,即使你没有意识到它们。你可能曾经在老电影或者电视中看到它们 (“版权所有 MCMXLVI” 而不是 “版权所有1946”),或者在某图书馆或某大学的贡献墙上看到它们 (“成立于 MDCCCLXXXVIII”而不是“成立于1888”)。你也可能在某些文献的大纲或者目录上看到它们。这是一个表示数字的系统,它实际上能够追溯到远古的罗马帝国 (因此而得名)。

在罗马数字中,利用7个不同字母进行重复或者组合来表达各式各样的数字。

  • I = 1
  • V = 5
  • X = 10
  • L = 50
  • C = 100
  • D = 500
  • M = 1000

下面是关于构造罗马数字的一些通用的规则的介绍:

  • 字符是叠加的。I 表示 1II 表示 2,而 III 表示 3VI 表示 6 (字面上为逐字符相加,“51”),VII 表示 7VIII 表示 8
  • 含十字符 (IXCM) 至多可以重复三次。对于 4,你则需要利用下一个最大的含五字符进行减操作得到:你不能把 4 表示成 IIII,而应表示为 IV (“5 1”)。数字 40 写成 XL (比 5010),41 写成 XLI42 写成 XLII43 写成 XLIII,而 44 写成 XLIV (比 5010,然后比 51)。
  • 类似地,对于数字 9,你必须利用下一个含十字符进行减操作得到:8 表示为 VIII,而 9 则表示为 IX (比 101),而不是 VIIII (因为字符 I 不能连续重复四次)。数字 90 表示为 XC900 表示为 CM
  • 含五字符不能重复。数字 10 常表示为X,而从来不用VV来表示。数字 100 常表示为C,也从来不表示为 LL
  • 罗马数字一般从高位到低位书写,从左到右阅读,因此不同顺序的字符意义大不相同。DC 表示 600;而 CD 是一个完全不同的数字 (为 400,也就是比 500100)。CI 表示 101;而IC 甚至不是一个合法的罗马字母 (因为你不能直接从数字100减去1;这需要写成 XCIX,意思是比 100 10,然后加上数字 9,也就是比 101的数字)。

python版本:

ADD, DEL, UNIT, DECADE, HUNDRED, THOUSEND = 0, 1, 1, 10, 100, 1000
Compute = lambda a,x,y: x + y if a == ADD else y + x

def mapRoman(Num):
 mapFun = mapNum()
 return reduce(lambda x,y: x + y, map(mapFun,subtractNum(Num, THOUSEND, [])))

def subtractNum(Num, Level, Result):
 if Num == 0 :
  return Result if Level == 0 else subtractNum(0, Level/10, Result + [(0, Level)])
 NewNum = Num / Level
 ModNum = Num % Level
 return subtractNum(ModNum, Level/10, Result + [(NewNum, Level)])


def mapNum():
    def func((Num, Level)):
        Action,ActionNum,Src,Dst = getAction(Num, Level)
        return getActionResult(Action,ActionNum,Src,Dst)
    return func

def getAction(Num, Level):
    Dict = {UNIT:("I","V","X"), DECADE:("X", "L", "C"), HUNDRED:("C", "D", "M"), THOUSEND:("M", "", "")}
    One, Five, Ten =  Dict[Level]
    if Num in range(1, 4):
        return ADD, Num - 1, One, One
    elif Num in range(5, 9):
        return ADD, Num - 5, Five, One
    elif Num == 4:
        return DEL, 1, Five, One
    elif Num == 9:
        return DEL, 1, Ten, One
    else:
        return ADD, 0, "", ""

def getActionResult(Action,Num,Src,Dst):
 if Num == 0: return Src
 return getActionResult(Action, Num - 1, Compute(Action, Src, Dst), Dst)


测试 myassert("MDCCCLXXXVIII", mapRoman(1888))

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值