-1

如何将罗马数字翻译或处理为十进制数字,反之亦然?我想在 C 中执行此操作。想法是获取数字或字母并进行处理。

这是一个例子:

MDXXIII = One thousand five hundred and twenty-three
One thousand five hundred and twenty-one = MDXXI
4

2 回答 2

2

从十进制到罗马非常简单;反过来就有点棘手了。

罗马数字有几组规则;让我们以最常见的一个为例:

  • 五和十的倍数的符号是
    • I
    • V
    • X
    • L五十
    • C一百
    • D五百
    • M一千
  • 之间的值可以通过连接多个相同字符来完成
    • II
    • III
    • XX二十
    • XXX三十
  • 之间的值可以通过连接多个不同字符来完成
    • VI
    • IV
    • XI十一
    • DI五十一
    • CX一百一十
    • XC九十
  • 禁止某些组合,更好:只允许以下组合
    • ab如果a >= b(例如:II,,VI
    • ba如果5b = a10b = a(例如:IV, XD, IX, XC
  • 例外:
    • 有时,相同值的连接符号的最大数量是三个(例如:IIIand IVXXXand XD)或四个(例如:IIII代替IVXXXX代替XD),但不会多或少。

提示:一个碱基到另一个碱基的转换最好从数字的最小部分到最大部分进行。

于 2016-08-21T03:43:21.817 回答
1

一个简单的方法是读取整个罗马数字字符串,然后从后面处理字符串。

例如:XIV 你从 V 开始,= 5 向后移动 1,现在是 I,I 小于 V 所以现在减去 1,即 4。然后你回到 X,现在 X 大于 I,所以添加10 到较早的值(即 4),然后变为4+10 = 14.

第 1 步:开始
第 2 步:将罗马数字读取为字符串
第 3 步:找出罗马数字的长度
第 4 步:针对字符串中的每个字符

 1. if(char = I) then decimal = 1
 2. if(char = V) then decimal = 5    
 3. if(char = X) then decimal = 10  
 4. if(char = L) then decimal = 50  
 5. if(char = C) then decimal = 100  
 6. if(char = D) then decimal = 500  
 7. if(char = M) then decimal = 1000  
 8. otherwise invalid character

第5步:重复第4步,直到字符串的长度
第6步: k = char[length - 1]
第7步:对十进制字符串的每个字符

  1. if(decimal[i] > decimal[i - 1]) then k = k - decimal[i - 1]

  2. else if(decimal[i] = decimal[i - 1 or decimal[i] < decimal[i - 1) then k = k + decimall[i - 1]

第 8 步:重复第 7 步,直到十进制字符串的长度
第 9 步:打印十进制值
第 10 步:停止

于 2016-08-21T03:42:25.697 回答