有没有人看到为什么这样做什么都不返回?
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) + "");
答案 0 :(得分:3)
分号错误:
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) {...}
答案 1 :(得分: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 /= 10
和d *= 10
都将d
等于0.这可能不是您想要的。这应该导致无限循环。
其次,假设您从其他d
开始:首先,在循环的第一个语句中将其除以10。然后,当你重新开始重复循环时,再次将它乘以10。这只会让你回到你开始的地方。这样也会导致无限循环。
通常,如果在for
循环中有一个变量,那么你也可以修改循环体中的相同变量。 (在此示例中为d
。)通常这只是一个错误。即使它不是一个错误,你知道你在做什么,我认为它仍然是不好的做法,因为它对读者来说非常混乱;如果你真的想做那样的话,请改用while
循环。
答案 2 :(得分:2)
我实际上认为我看到你的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