2014-03-04 135 views
0

有沒有人看到一個原因,爲什麼這隻會返回什麼?浮點法的奇怪行爲。超載?

public static float sumDigits(int n) { 
    float retVar = 0; 
    while (n > 10) { 
     float d; 
     for (d = 0; d < n; d *= 10); 
     d /= 10; 
     retVar += n/d; 
     n %= d; 
    } 
    n += n; 
    return retVar; 
} 

我通過

把它叫做
System.out.println(sumDigits(123) + ""); 

回答

2

我真的覺得我看到你的循環應該做什麼,這是一個小功能。但正如一些人所指出的那樣,d開始爲0,所以它總是最終0

只是改變d爲1將停止你的無限循環:

for (d = 1; d < n; d *= 10); 

但答案仍然是因爲它錯誤看起來你想要總結數字。 (例如1 + 2 + 3 = 6,但是返回的結果是3.53

由於您正在處理個別數字,因此您不需要小數值,因爲在這裏使用float是不好的。你想要數字四捨五入。所以你需要將你的臨時變量改爲int。

還有最後一個數字被跳過的最後一件事。在這一點上,我得到3作爲答案。在將while(n > 10)更改爲while(n > 0)後,返回正確的答案。

因此,代碼會是這樣:

public static int sumDigits(int n) { 
    int retVar = 0; 
    while (n > 0) { 
     int d; 
     for (d = 1; d < n; d *= 10); 

     d /= 10; 
     retVar += n/d; 
     n %= d; 
    } 
    return retVar; 
} 

有一個小竅門,有一個簡單的解決是先從最小的數字,而不是最大的同樣的問題的方式:

while(n > 0) { 
    retVar += n % 10; 
    n /= 10; 
} 

最後說明

如果我是正確的for循環,重要的是要帶回家的是,如果你寫這樣的東西這樣的話沒有人會認爲這是故意的。像這樣的語法實際上可以正常工作,但它很晦澀,更像是一種新奇。

環路可更換這樣這是更爲清晰,就像緊湊:

int d = 0; 
while(d < n) { 
    d *= 10; 
} 

或者,如果你真的想:

int d = 0; 
while(d < n) d *= 10; // not recommended but clearly has a body 
+0

如果我確實需要一個帶有空語句的'for'或'while'循環作爲一個正文,我將分號放在下一行,本身並縮進。這使得讀者更難以認爲這是一個錯誤。評論也有幫助。 – ajb

+0

P.S.把這個弄出來好好工作。我們得到了很多這樣的問題,新手們在這裏最終放置了分號,因爲他們認爲他們必須在所有內容後面加上分號,以至於我無法理解這可能是有意的。 – ajb

+0

這實際上完全是我所需要的。我應該指定'for()'循環做了什麼。我發佈這個之後不久嘗試設置d = 1,但沒有更新。如果我不使用愚蠢的網頁編譯器(iPad),那將會很好,因爲它仍然沒有返回結果。 – StuAlex

3

壞分號位置:

for (d = 0; d < n; d *= 10); // that terminal semicolon will mess you up! 

這相當於:

for (d = 0; d < n; d *= 10) { 
    // do nothing 
} 
  • 擺脫那個終端分號。
  • 讓您d局部變量的for循環:for (int d = 0; d < n; d *= 10) {...}
  • 務必附上所有循環塊大括號
  • 良好的代碼格式是不存在只是爲了讓你的代碼迴路漂亮 - 它也可以幫助你調試。
+1

我不認爲這是足以讓循環停止,更不用說做什麼。 'd'仍然總是爲零。 – delnan

2

正如已經指出的那樣,你的分號位置意味着你執行一個循環,不執行任何操作:

for (d = 0; d < n; d *= 10); 
    d /= 10; 
    retVar += n/d; 
    n %= d; 

但剛剛殺青的循環結構不會幫助你:

for (d = 0; d < n; d *= 10) { 
     d /= 10; 
     retVar += n/d; 
     n %= d; 
    } 

首先,如果您以d = 0開頭,那麼d /= 10d *= 10將使d等於0.這不可能是您想要的。這應該導致無限循環。

其次,假設您從其他一些開始d:首先在循環的第一個語句中將其除以10。然後,當你回到重複循環時,你再次乘以10。這隻會讓你回到你已經開始的地方。這也會導致無限循環。

一般而言,當您在for循環中有變量時,您在循環體中修改同一個變量也是錯誤的。 (在這個例子中爲d)。通常這只是一個錯誤。即使它不是一個bug,而且你知道自己在做什麼,但我認爲這仍然是一個不好的做法,因爲這對讀者來說非常混亂。如果你真的想這樣做,請使用while循環。