免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5673 | 回复: 6
打印 上一主题 下一主题

[ML][练习] 阿拉伯数字转罗马数字 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-13 00:33 |只看该作者 |倒序浏览
《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
复制代码


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

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2008-11-13 09:40 |只看该作者
原帖由 win_hate 于 2008-11-13 00:33 发表
啊哈......这个值好象在那里见过。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
3 [报告]
发表于 2008-11-13 10:45 |只看该作者

回复 #1 win_hate 的帖子

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

论坛徽章:
0
4 [报告]
发表于 2008-11-14 12:55 |只看该作者
原帖由 MMMIX 于 2008-11-13 10:45 发表
不过,要处理 >= 4000 的数字,用 ASCII 码就不太方便了。


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

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



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

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
5 [报告]
发表于 2008-11-14 14:31 |只看该作者
原帖由 win_hate 于 2008-11-14 12:55 发表

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

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

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

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

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

论坛徽章:
0
6 [报告]
发表于 2008-11-14 21:02 |只看该作者
学到!

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

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
7 [报告]
发表于 2008-11-14 22:28 |只看该作者
原帖由 win_hate 于 2008-11-14 21:02 发表
学到!

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

现在常用的罗马数字都很小的,超过一百的都很少见。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP