问题
实现罗马数字和阿拉伯数字之间的转换
分析
罗马字母和阿拉伯数字之间的对应:
罗马字母 | 阿拉伯数字 |
---|---|
I | 1 |
V | 5 |
X | 10 |
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,则不能被重复
- 右加左减,但是不能跨位相减,也就是百位能减十位,但不能减个数位,类似的,千位只能减百位,不能减十位、个位
- 不能左减5、50、500,即V、L、D这三个字母
- 如果同时有两个相对小数值字母分列紧挨在一个大数值字母旁,则第一个(即左边的)小数值字母必须大于第二个(即右边的)小数值字母,如140只能表示成CXL而不是XCL
下面是判断是否是合法罗马数字的正则表达式:^M?M?M?(CM|CD|D?C?C?C?)(XC|XL|L?X?X?X?)(IX|IV|V?I?I?I?)$
源码
参考:
http://www.ohehlium.com/journal/2007/02/04/268/ http://en.wikipedia.org/wiki/Roman_numerals