[ML][练习] 阿拉伯数字转罗马数字

发布于 2022-08-11 02:04:22 字数 2022 浏览 37 评论 6

《ML》 程序设计的一个习题:

书写一个函数来将整数转化成罗马数字表示。输入合适的参数,你的函数应该可以将 1984 表达成 MDCCCCLXXXIIII 或者 MCMLXXXIV.

我只写了后面的一种表示

  1. local
  2. val basis=
  3.     [(1000, "M"), (500, "D"), (100, "C"), (50, "L"), (10, "X"), (5, "V"), (1, "I")];   
  4. fun fix "M" = (100, "C")
  5.   | fix "D" = (100, "C")
  6.   | fix "C" = (10, "X")
  7.   | fix "L" = (10, "X")
  8.   | fix "X" = (1, "I")
  9.   | fix "V" = (1,"I")
  10.              
  11. fun i2r 0 bs = ""
  12.   | i2r x ((v, p)::bs) =
  13.     if (x >= v) then
  14.         p^ (i2r (x-v) ((v, p)::bs))
  15.     else let val t = fix p in
  16.              if v-(#1 t) <= x then
  17.                  (#2 t)^p^ (i2r (x-v+(#1 t)) bs)
  18.              else
  19.                  i2r x bs
  20.          end;
  21. in
  22. fun arabic_to_roman n =  i2r n basis;
  23. end;

复制代码

代码很一般,但重点不在这里。看测试:

  1. - arabic_to_roman 1984;
  2. > val it = "MCMLXXXIV" : string

复制代码

对的,再测:

  1. - arabic_to_roman 3009;
  2. > val it = "MMMIX" : string

复制代码

啊哈......这个值好象在那里见过。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

囚我心虐我身 2022-08-18 21:16:25

原帖由 win_hate 于 2008-11-14 21:02 发表
学到!

写这段代码前专门查过罗马数字规则的。长长的一篇,里头提到了你说的那种横线,因为没见过,所以直接跳过去了,

现在常用的罗马数字都很小的,超过一百的都很少见。

血之狂魔 2022-08-18 21:10:59

学到!

写这段代码前专门查过罗马数字规则的。长长的一篇,里头提到了你说的那种横线,因为没见过,所以直接跳过去了,

听不够的曲调 2022-08-18 21:08:01

原帖由 win_hate 于 2008-11-14 12:55 发表

但为什么一定限制在 4000 呢?

因为在 >= 4000 的时候,需要用到在 V、X 等之上加一横这种符号(表示在原来符号代表的数字的基础上乘 1000),如:

_
V

而这些符号是没办法用 ASCII 表示的(除非用两行字符模拟)。不过这种用法好像是后来才出现的。

另外,罗马数字这种数字系统,由于不是基于进位的(positional notation),使用也相当的不便,包括无法方便的表示大数。

[ 本帖最后由 MMMIX 于 2008-11-14 14:37 编辑 ]

你怎么这么可爱啊 2022-08-18 18:40:38

原帖由 MMMIX 于 2008-11-13 10:45 发表
不过,要处理 >= 4000 的数字,用 ASCII 码就不太方便了。

M 老大的话总是令我揣摩不透,

你的意思是罗马数字不适合表示大数吗?这个是事实。我以前看过 George Gamow 的《从一到无穷大》中,其中有一幅图一直印象深刻。就是下面这幅:

Screenshot.png (37.83 KB, 下载次数: 7)

下载附件

2008-11-14 12:55 上传

但为什么一定限制在 4000 呢?

超可爱的懒熊 2022-08-18 04:52:26

不过,要处理 >= 4000 的数字,用 ASCII 码就不太方便了。

蛮可爱 2022-08-14 22:01:20

原帖由 win_hate 于 2008-11-13 00:33 发表
啊哈......这个值好象在那里见过。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文