[英]Odd behavior of a float method. Overloading?
有誰看到一個為什么它只會不返回任何東西的原因?
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) + "");
分號放置錯誤:
for (d = 0; d < n; d *= 10); // that terminal semicolon will mess you up!
這等效於:
for (d = 0; d < n; d *= 10) {
// do nothing
}
for (int d = 0; d < n; d *= 10) {...}
正如已經指出的那樣,分號放置意味着您正在執行不執行任何操作的循環:
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 /= 10
和d *= 10
都將使d
等於0。這不是您想要的。 這將導致無限循環。
其次,假設您從其他d
開始:首先,在循環的第一條語句中將其除以10。 然后,當您返回以重復該循環時,請再次將其乘以10。 那只是帶您回到開始的地方。 這樣也會導致無限循環。
通常,當您在for
循環中有一個要更改的變量時,在循環體中也修改相同的變量是錯誤的。 (在此示例中為d
。)通常這只是一個錯誤。 即使這不是一個錯誤,並且您知道自己在做什么,但我認為這仍然是一種不好的做法,因為它會使讀者感到困惑。 如果您確實想做類似的事情,請改用while
循環。
我實際上認為我知道您的for循環應該做什么,這是一個小功能。 但是,正如其他人指出的那樣, 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.