2014-11-08 82 views
1

我是一名新的編程學生,我的任務是將羅馬數字的輸入轉換爲整數值。下面是我給出的內容:將羅馬數字轉換爲整數值?

編寫一個程序,將羅馬數字(如MCMLXXVIII)轉換爲其十進制數字表示形式。這個程序必須有3個方法和一個主要方法!

  1. 編寫一個方法,該方法從用戶獲取輸入並將其傳遞給轉換方法。
  2. 編寫一個產生每個字母(轉換方法)的數字值的方法。
  3. 編寫一個輸出用戶輸入的號碼和轉換後的號碼的方法。
  4. 編寫一個主要方法來測試3種方法。

提示:使用單維數組!

轉換字符串如下:

•請看前兩個字符。如果第一個值比第二個值大,那麼只需轉換第一個。

•再次爲從第二個字符開始的子字符串調用轉換方法。

•添加兩個值。 o如果第一個值小於第二個值,則計算差值並添加尾部轉換。

現在我正在努力弄清楚爲我的轉換方法做些什麼。這是我迄今爲止所寫的內容:

public static String romanInput(String number) { 

    Scanner numberInput = new Scanner (System.in); 
    System.out.print("Enter a roman numeral: "); 
    String userInput = numberInput.next(); 

    return userInput; 
} 

public static int numberConversion(int number) { 

    int romanConv = 0; 

    char[] romanChar = {1, 5, 10, 50, 100, 500, 1000}; 
    for (int i = 0; i < romanChar.length; i++) 

} 

您可以看到我已經編寫了接受用戶輸入的方法。我認爲我做得對。但是,我不知道該如何處理這種轉換方法。它說,使用一維數組所以這就是我所做的在這裏:

char[] romanChar = {1, 5, 10, 50, 100, 500, 1000}; 

這些都應該是I,V,X,L,C,d的值,M。我真的只是困惑從哪裏去,如果有人能幫助我,我將不勝感激。

+0

這是沒地方解決你的功課,首先儘量想轉換的算法,它張貼在這裏和那麼我們可以幫助你,如果你有特定的問題。 – Uhla 2014-11-08 15:26:25

+0

不是重複的,所以我將不勝感激,如果你不穀歌我發佈的,因爲你真的認爲我會問這個問題,如果我沒有自己先谷歌它?這個問題的問題是我沒有了解哈希表和枚舉,所以我不能期望使用它們。 「這不是解決你家庭作業的地方」。真?如果沒有指導我一路走下去,你無法幫助學生朝着正確的方向前進。不要求任何人解決這個任務。 – NEPat10 2014-11-08 15:36:27

+0

每個人都要求詳細的問題,所以這就是我給的,我沒有得到任何人的幫助。 – NEPat10 2014-11-08 15:36:55

回答

0

如果我是你,我會開始一次採取一個嬰兒步驟。例如,如果我唯一擔心的輸入是「我」,那麼是什麼?這當然是微不足道的。

接下來,如果輸入是「II」,那麼什麼?這表明我需要一次處理輸入的一個字符。兩個「我」等於一個,結果就是兩者的總和。這意味着,我必須有一個「結果」或一些這樣的變量,初始化爲零,然後對於輸入字符串中的每個字符(I,然後I),將其轉換爲其數值(1,然後1),add他們起來並返回價值。

這個邏輯也適用於「III」。

但是接下來你面對你的第一個挑戰「IV」。這不是微不足道的,特別是如果你是新手這樣的算法。讓我把它放在一邊,注意這很難,所以稍後會處理。

值「V」,「VI」,「VII」,「VIII」都可以正常工作。

但是我再次被卡住了「IX」。類似於上面的「IV」。也許我現在對這兩個有了一個想法,但是,也許我暫時還會把這兩個問題放在一邊。

這適用於「X」,「XI」,「XII」,「XIII」,然後再次出現「XIV」的問題。

我會抵制解決「IV」,「IX」,「XIV」等問題的誘惑,以便您自己嘗試;請記住,這些都不是微不足道的,至少與我上面寫的相比。試試看。

所以你看,增量式加法運作良好,但減少是一個未解決的問題。

希望這會有所幫助。

1

羅馬數字是非位置的,這意味着數字的值不取決於他們的位置,你可以忽略後者。然後添加所有數字的值就足夠了。

反正有一個例外:如果一個數字緊接在一個更高數值的數字之前,那麼它被減去而不是增加。

因此處理很簡單:

  • 清除累加器。

  • 從左到右讀數字。對於新的每個數字,將其轉換爲其值並將其添加到累加器。累加器最後包含數字值。

來處理異常,你可以使用下面的訣竅:

  • 使用持有原先的數字(初始設置爲M的值)的值的變量;

  • 噹噹前數字的值比前一個數值高時,必須通過減去前兩個值的兩倍來更正累加器。

編程:

(Initialize) 
Prv= 1000 
Acc= 0 

Loop: 
    (Accumulate) 
    Cur= Lookup(Digit[i]) 
    Acc+= Cur 

    (Adjust for inversions) 
    if Prv < Cur -> Acc-= 2 * Prv 
    Prv= Cur 

例如,CXIX給

Prv Cur Acc 
C 1000 100 100 
X 100 10 110 
I 10 1 111 
X 1 10 121-2*1 = 119 
+0

還有一個挑戰:有時候你可以找到象IIX(8)這樣的符號,而簡單的規則'Prv 2014-11-08 16:00:11