使用语法导向的转换方案将整数转换为罗马数字?

时间:2008-11-06 01:03:20

标签: compiler-construction roman-numerals translation-scheme

龙书包括使用语法指导的翻译方案将整数转换为罗马数字的练习。

如何完成?

3 个答案:

答案 0 :(得分:2)

我会考虑从右到左解析。

首先,我会映射单位列:

0 -> ''
1 -> 'I'
2 -> 'II'
3 -> 'III'
4 -> 'IV'
...
9 -> 'IX'

然后,如果有第二列(例如右边第二列=第二列),我会用它来映射到

0 -> ''
1 -> 'X'
2 -> 'XX'
...
9 -> 'XC'

这需要在初始输出前加上。

重复下一列(数百,数千),直到用完字母。

仔细检查数字不是'0'还是负数。

答案 1 :(得分:2)

另一种方法是在二维数组中存储1,5,10,50,100,500,1000等罗马数字。示例(在PHP数组中):

$roman = array(
  [0] = array( 1=>"I", 5=>"V", 10=>"X" ),
  [1] = array( 1=>"X", 5=>"L", 10=>"C" ),
  [2] = array( 1=>"C", 5=>"D", 10=>"M" ),
  [3] = array( 1=>"M", 5=>"^V", 10=>"^X" ),
);

然后从右到左取每个数字并应用以下翻译。设置变量$ level = 0并在处理完每个数字后将其值增加1:

1 => $roman[$level][1]
2 => $roman[$level][1].$roman[$level][1]
3 => $roman[$level][1].$roman[$level][1].$roman[$level][1]
4 => $roman[$level][1].$roman[$level][5]
5 => $roman[$level][5]
6 => $roman[$level][5].$roman[$level][1]
7 => $roman[$level][5].$roman[$level][1].$roman[$level][1]
8 => $roman[$level][5].$roman[$level][1].$roman[$level][1].$roman[$level][1]
9 => $roman[$level][1].$roman[$level][10]

(用PHP a'。'连接两个字符串)

示例:1945

5 => $roman[0][5] = "V"
4 => $roman[1][1].$roman[1][5] = "XL"
9 => $roman[2][1].$roman[2][10] = "CM"
1 => $roman[3][1] = "M"

所以翻译的数字是“MCMXLV”

对不起,这可能无法完全回答你的问题,但我希望它有任何帮助..

答案 2 :(得分:2)

接下来是语法,用于表示从1xxx格式的数字到罗马数字的语法指导翻译。

number = OneThousand digit3 digit2 digit1 | nzdigit3 digit2 digit1 | nzdigit2 digit1 | nzdigit1

  

OneThousand - > 1 {print('M')}

     

digit3 - > 0位3 - > nzdigit3

     

nzdigit3 - > 1 print('C')nzdigit3 - > 2打印('CC')nzdigit3 - > 3   print('CCC')nzdigit3 - > 4打印('CCCC')nzdigit3 - > 5打印('D')   nzdigit3 - > 6打印('DC')nzdigit3 - > 7 print('DCC')nzdigit3 - > 8   print('DCCC')nzdigit3 - > 9打印('DCCCc')

以类似的方式为2和1位的数字写定义,您将需要翻译。