我真的觉得我看到你的循环应该做什么,这是一个小功能。但正如一些人所指出的那样,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
如果我确实需要一个带有空语句的'for'或'while'循环作为一个正文,我将分号放在下一行,本身并缩进。这使得读者更难以认为这是一个错误。评论也有帮助。 – ajb
P.S.把这个弄出来好好工作。我们得到了很多这样的问题,新手们在这里最终放置了分号,因为他们认为他们必须在所有内容后面加上分号,以至于我无法理解这可能是有意的。 – ajb
这实际上完全是我所需要的。我应该指定'for()'循环做了什么。我发布这个之后不久尝试设置d = 1,但没有更新。如果我不使用愚蠢的网页编译器(iPad),那将会很好,因为它仍然没有返回结果。 – StuAlex