罗马数字(Roman Numerals)的表达规则

Stone前两天在他的Blog里提到了Super Bowl XLI,我还以为XLI只是一个标识而已,但今天听广播提到了第四十一届Super Bowl(美国橄榄球超级杯)才反应过来,原来XLI是罗马数字里表达四十一 / 41的方式。

相信大家对于10及以下的罗马数字还是挺熟悉的:I、II、III、IV、V、VI、VII、VIII、XI、X (依序为 1- 10 )这些表达方式里其实只包含了I(表示1)、V(表示5)、X(表示10)三个字母而已。大于10之后,虽然比较少见,但大家其实也可以猜测可能需要表达的数量,应该就是50、100、500、1000… 只不过可能不熟悉具体和哪个字母挂钩而已。

事实上也的确如此:罗马数字一共只有7个字母,除了之前提的三个,剩下的四个字母为:L(表示50)、C(表示100)、D(表示500)、M(表示1000)。有了这些字母之后,余下的还需要一个规则来组合这些字母来表达数字。其规则大致如下:

  • 字母能累计叠加,如I是1,II是2,III是3
  • 这是对上面规则的一个约束,即表示10的n(n=0、1、2、3)次幂的字母(也即I、X、C、M)最多只能重复3次;而剩余的三个字母V、L、D,则不能被重复。
  • 右加左减。右加比较容易理解,比如XVI就是(10+5+1=16)。而左减这个规则的出现则解决了表达4、9、40等等之类数字的难题,比如4就是IV(在5左边写个1,因为不能靠写四个1来完成),而40就是XL(50-10)。
  • 这又是对上面左减规则的约束:也就是不能跨位相减,也就是百位能减十位,但不能减个数位,类似的,千位只能减百位,不能减十位、个位。所以99就不能表示成IC(100-1?NO!),而只能复杂的写成90(XC)+9(IX),合起来是XCXI。左减的第二个约束则是,左减的字母只能重复一次,也即不能用IIX来表示8,而必须用VIII(这样就可以来减少同一个数字却有多种罗马表达方式的情况)。左减的还有一个约束则是,不能左减5、50、500,即V、L、D这三个字母。

说到这儿,大家都应该可以认出XLI来了。然后本人对于XCL这个表示方法特别感兴趣,就想这也是个符合规则的罗马数字了吧,应该表示的是XC(90)+L(50)=140,幸好不是250。不过回头一想,CXL岂不应该是更合理的表达方式(C(100)+XL(40)) ?这不就有重复的表达方式了?这回维基百科也没能解决这个问题,倒还又是Google解决了这个罗马数字的重复性,其实也就是还少了一条规则:

  • 如果同时有两个相对小数值字母分列紧挨在一个大数值字母旁,则第一个(即左边的)小数值字母必须大于第二个(即右边的)小数值字母。比如XCI(91)就为合理,因为虽然X、I同时小于C,但同时X大于I(同样道理,一开始提到的XLI也符合规则)。而刚好是我姓名起始字母的XCL,则由于X小于处于C另一边的L,不符合本规则。140也就只能表达为CXL。

大家看到这儿可能也就会想到,那如果按照此规则,最大的可表达数字也莫过于MMMDCCCLXXXVIII(1000×3+500+100×3+50+10×3+5+1×3)=3888 而已。所以其实还有些别的方法来表达更大的数字,比如V就是在字母上面加横线的方式来表示该字母乘了1000,所以V也就是5000。

最后,如果大家对正则表达式(Regular Expression)有所了解,那要判断一个罗马数字(这儿只考虑3888以下的数字)是否是规则的表达方式,就可以通过下面这个模式来判断:
‘^M?M?M?(CM|CD|D?C?C?C?)(XC|XL|L?X?X?X?)(IX|IV|V?I?I?I?)$’

图注:由于历史原因,对于字母重复次数的规定并不是很严格,所以也有出现IIII,CCCC等等的情况。

clock but IIII

Comments 4

  1. Stone wrote:

    天啊, 这么牛, 我当时写blog的时候还想问一句谁知道那个为什么是41呢, 结果忘了. 正好今天你解释了

    Posted 05 Feb 2007 at 2:48 am
  2. aries wrote:

    呵呵,以前看过罗马数字的介绍,后来早忘了,听了广播才又回突然想起来一些。然后就现学现卖了..

    Posted 05 Feb 2007 at 8:00 pm
  3. scorp wrote:

    “海外中国人所遇到的最尴尬的X问题是一位“习”姓朋友。“习”
    字用汉语拼音写出来是Xi,而姓氏在英语常常会大写,所以Xi在银行文件中写成了XI。
    这位习先生在美国的银行办事,轮到他的时候,美国银行职员照着文件上的姓氏吭哧了半天,随后喊了一声:Mr. Eleven(“11先生”)!XI怎么成了“11”?Well,在罗马数字中,XI就是11啊,您忘了吗?”

    Posted 08 Feb 2007 at 12:01 am
  4. chemfox wrote:

    晕了~~~~~~

    Posted 08 Feb 2007 at 12:04 am

Post a Comment

Your email is never published nor shared. Required fields are marked *