6

龍書包括使用語法指導翻譯方案將整數轉換爲羅馬數字的練習。使用語法指導翻譯方案將整數轉換爲羅馬數字?

這怎麼完成?

+1

看起來像一個家庭作業問題,聞起來像一個功課問題...;-) – 2008-11-06 03:41:07

+0

是的,我知道......我希望我能證明我沒有作弊。 對於CS學生來說,這實際上是一個家庭作業問題......只是,不是我,我只是自己閱讀這本書,沒有老師(或知識足夠的朋友)去問。 – 2008-11-06 12:08:24

回答

2

我會考慮從右到左的解析。

首先,我將映射單元柱:

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

然後,如果有一個第二柱(例如,第二從右側=幾十柱),我會使用映射到

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

這將需要預先添加到初始輸出。

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

仔細檢查數字是不是'0'或否定的。

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"), 
); 

然後從右到左取每個數字並應用以下翻譯。設置一個變量$水平= 0和處理的每個數字後增加1它的值:( '' 在PHP concats兩個字符串)

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] 

實施例: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

接下來是語法來表示從數字格式1xxx到羅馬數字的語法指導翻譯。

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

OneThousand - > 1 {打印( 'M')}

digit3 - > 0 digit3 - > nzdigit3

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

(> DCC')nzdigit3 - > 8

以類似的方式爲2位和1位的數字寫入定義,您將需要翻譯。