轨道
/
Common Lisp
Common Lisp
/
练习
/
罗马数字
罗马数字

罗马数字

简单

简介

如今,世界上大多数人都在使用阿拉伯数字(0–9)。 但如果你回到两千年前,就会发现大多数欧洲人用的其实是罗马数字。

写罗马数字时,我们会用到下面这些拉丁字母,每个字母都对应一个数值:

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

一个罗马数字就是这些字母组成的一个序列,它的值就是所有字母数值的总和。 例如,XVIII 的值是 18(10 + 5 + 1 + 1 + 1 = 18)。

不过有一条规则会让事情变得复杂一些:同一个字母不能连续出现超过三次。 也就是说,我们不能用看起来很自然的 IIII 来表示 4 这样的数字。 对于这类数字,我们要用两个字母相减的方式来表示。 所以我们不把 4 看成 1 + 1 + 1 + 1,而是看成 5 - 1。 用我们现代的思维来看,有点费解的是:我们要把较小的数字写在前面。 这种情况只适用于以下几例:4(IV)、9(IX)、40(XL)、90(XC)、400(CD)和 900(CM)。

罗马数字里,顺序很重要! 字母(以及上面这些特殊的组合)必须按数值从大到小、从左到右排列。

下面是一些例子:

 105 => CV
---- => --
 100 => C
+  5 =>  V
 106 => CVI
---- => --
 100 => C
+  5 =>  V
+  1 =>   I
 104 => CIV
---- => ---
 100 => C
+  4 =>  IV

最后再来看一个更复杂的例子:

 1996 => MCMXCVI
----- => -------
 1000 => M
+ 900 =>  CM
+  90 =>    XC
+   5 =>      V
+   1 =>       I

说明

你的任务是把阿拉伯数字转换成罗马数字。

在本次练习中,我们只讨论传统的罗马数字,其中最大的数字是 MMMCMXCIX(即 3,999)。

Note

在阿拉伯数字和罗马数字之间进行转换的方法有很多种。 我们建议你先采用一种朴素的方法,熟悉罗马数字的概念,然后再去寻找更高效的方法。

别忘了在最后观看我们的深度探索视频,了解你可以采用的不同方法!

通过 GitHub 编辑 链接将在新窗口或新标签页中打开
Common Lisp Exercism

准备好开始 罗马数字 了吗?

注册 Exercism,借助 27 个概念92 个练习 和真人导师指导,学习并掌握 Common Lisp,全部免费。

深入探索 罗马数字!

探索这个棘手练习的各种不同解法,从递归到基于表的查找,还有一种使用混合进制数的解法,以及 Common Lisp 的一些简单作弊手法。