[ML][练习] 阿拉伯数字转罗马数字
《ML》 程序设计的一个习题:
书写一个函数来将整数转化成罗马数字表示。输入合适的参数,你的函数应该可以将 1984 表达成 MDCCCCLXXXIIII 或者 MCMLXXXIV.
我只写了后面的一种表示
- local
- val basis=
- [(1000, "M"), (500, "D"), (100, "C"), (50, "L"), (10, "X"), (5, "V"), (1, "I")];
- fun fix "M" = (100, "C")
- | fix "D" = (100, "C")
- | fix "C" = (10, "X")
- | fix "L" = (10, "X")
- | fix "X" = (1, "I")
- | fix "V" = (1,"I")
- fun i2r 0 bs = ""
- | i2r x ((v, p)::bs) =
- if (x >= v) then
- p^ (i2r (x-v) ((v, p)::bs))
- else let val t = fix p in
- if v-(#1 t) <= x then
- (#2 t)^p^ (i2r (x-v+(#1 t)) bs)
- else
- i2r x bs
- end;
- in
- fun arabic_to_roman n = i2r n basis;
- end;
复制代码
代码很一般,但重点不在这里。看测试:
- - arabic_to_roman 1984;
- > val it = "MCMLXXXIV" : string
复制代码
对的,再测:
- - arabic_to_roman 3009;
- > val it = "MMMIX" : string
复制代码
啊哈......这个值好象在那里见过。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
现在常用的罗马数字都很小的,超过一百的都很少见。
学到!
写这段代码前专门查过罗马数字规则的。长长的一篇,里头提到了你说的那种横线,因为没见过,所以直接跳过去了,
因为在 >= 4000 的时候,需要用到在 V、X 等之上加一横这种符号(表示在原来符号代表的数字的基础上乘 1000),如:
而这些符号是没办法用 ASCII 表示的(除非用两行字符模拟)。不过这种用法好像是后来才出现的。
另外,罗马数字这种数字系统,由于不是基于进位的(positional notation),使用也相当的不便,包括无法方便的表示大数。
[ 本帖最后由 MMMIX 于 2008-11-14 14:37 编辑 ]
M 老大的话总是令我揣摩不透,
你的意思是罗马数字不适合表示大数吗?这个是事实。我以前看过 George Gamow 的《从一到无穷大》中,其中有一幅图一直印象深刻。就是下面这幅:
Screenshot.png (37.83 KB, 下载次数: 7)
下载附件
2008-11-14 12:55 上传
但为什么一定限制在 4000 呢?
不过,要处理 >= 4000 的数字,用 ASCII 码就不太方便了。