2014-03-04 69 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循环。