2012-11-06 59 views
2

我正在用Java編寫Atoi函數。它對+ ve整數運行良好。但是我想要的是,當我輸入一個負整數時,它會給我一個錯誤。所以我試着在我的課堂上包括繼續發言。實施的班級是:Java中的Atoi爲負值

class Atoi { 

    int atoi(String tmp) { 

    int result = 0; 

     for (int i = 0; i < tmp.length(); i++) { 

      char digit = (char)(tmp.charAt(i) - '0'); 

     if(digit == '-') 

     continue; 
     } 

     else { 

      result += (digit * Math.pow(10, (tmp.length() - i - 1))); 
     } 

    return result; 

    } 
} 

但不幸的是,它給了我的負面等值的角色,即-12它給了我655312!幫幫我。

編輯:假設我需要檢查浮點數,我該怎麼辦?如果我輸入12.1或123.2,它應該分別返回12.1和123.2!

回答

1

了明顯的問題快速修復:與其

char digit = (char)(tmp.charAt(i) - '0'); 
    if(digit=='-') 
    continue; 

邏輯的順序錯了...

嘗試

char origChar=tmp.charAt(i); 
    if(origChar=='-') 
     continue; 
    char digit = (char)(origChar - '0'); 

但有兩個問題比較多:

  • 它不否定th e值,如果有' - '字符存在!
  • 如果這是輸入字符串:-1-2-3-4-5?結果會很有趣! 編輯:嘗試這個輸入也:'répa'...更有趣的結果!

不要忘記使用不正確的輸入,以測試過了,如@Klaus建議,不猶豫與正確的錯誤消息,拋出異常,(優選IllegalArgumentException)如果一個不正確的輸入被提供給功能...

+0

非常感謝!傻! :| – Chandeep

+0

第一種情況已解決..我使用了一個變量「負數」初始化爲0.如果出現,它會增加1 ..所以如果負數== 1,則在數字前出現 - 符號。第二個問題仍然嘗試弄清楚!將在11分鐘內接受你的答覆! ;) – Chandeep

+0

提示:我認爲只有第一個字符可以是' - ',這個信息可以用... – ppeterka

0

如果你不想轉換負數,那麼只要你遇到-符號而不是進一步循環,只需返回0。把這個代碼放在if-else塊之前。

 if(tmp.charAt(i)=='-') 
     return 0; 
+0

這不起作用。由於'數字'永遠不會是'-'。仔細看看代碼。 –

+0

@RohitJain編輯它。這會做對嗎? – Abubakkar

+0

是的,這樣做。但是請引用它,它應該在if-else塊之前。事實上,之後不需要if-else。 –

2

相反的continue你應該給一個錯誤(拋出一個異常,return -1或任何你的意思「舉個eror」)。

如果你想忽略-可以else子句更改爲:

result = digit + result * 10; 
+0

+1這比在每次迭代中使用Math.pow更優雅(快速)。雖然這種想法需要習慣...但真正的問題是,他確實想要處理負數的數字! – ppeterka

+0

+1結果=數字+結果* 10 – Chandeep

+0

假設我需要檢查浮點數,我應該怎麼做?如果我輸入12.1或123.2,它應該分別返回12.1和123.2! – Chandeep

0
if(digit=='-') 

隨着

(char)(tmp.charAt(i) 

你的代碼假設沒有-'s

(char)(tmp.charAt(i) - '0'); 

是一個優化是盲目地將'數字'變量固定爲數字。 ('0'== 48),所以'1'(49) - ''是' 0'(48)= 1等...

1

你可以這樣寫代碼,當然,但你需要檢查TMP是一個有效的數字。

int atoi(String tmp) { 

    int result = 0; 

    int factor = tmp.charAt(0) == "-" ? -1 : 1; 

     for (int i = 0; i < tmp.length(); i++) { 

      if (tmp.chatAt(i) < '0' || tmp.chatAt(i) > '9') 

       continue; 

       char digit = (char)(tmp.charAt(i) - '0'); 

       result += (digit * Math.pow(10, (tmp.length() - i - 1))); 
     } 

     return result * factor; 
} 
1

如果沒有被作爲編程練習做,有一個簡單的解決方案:

static int atoi(String tmp) 
    { 
     int result = Integer.parseInt(tmp); 
     if(result >= 0) { 
     return result; 
     } else { 
     throw new IllegalArgumentException("Negative string "+"\"" + tmp + "\""); 
     } 
    } 

替代的陰性結果的情況下適當的異常或其他行動。如果你想不理「 - 」,因爲在發佈代碼,則更換IF-THEN-ELSE有:

 return Math.abs(result); 

此代碼也會引發對於喜歡「ABC」字符串異常。更一般地說,如果一個庫方法不能完全按照你想要的方式進行操作,通常很容易在一個修改其行爲的方法中使用它,而不是重寫它。