1

我正在尝试使我的 Hailstone 序列输出由于 int 的限制而无法计算的最小整数,但由于某种原因它仍然无法正常工作。关于为什么不这样做的任何想法将不胜感激。

    public static void main(String[] args) {
        int x=2; 
        int count = x;
        //Collatz Conjecture computation
        while (true)
        {   x=2; 
            x =count;
            while (x != 1)
            {   
                if (x % 2 == 0)
                    x = x / 2;
                if (x % 2 == 1)
                    x = x * 3 + 1;
                if (x < 0)
                {   System.out.print("The integer " + count + " cannot have its Hailstone sequence computed using int variables. ");
                    return;
                }
            }
            count ++;
        }
    }
4

2 回答 2

4

看看你实际上在做什么。您的打印语句位于带有条件的 if 语句中x < 0,但绝不x会小于。您正在执行的两个操作是:和。这些都不能将积极变成消极。0xx = x / 2x = x * 3 + 1


编辑:现在我明白这x < 0是为了测试 int 溢出。请记住,不能保证会发生这种情况,序列可能会陷入一个循环(并且可能会在大多数初始x,因为一旦序列到达你就会有这样一个循环1),尽管如果发生这种情况你的while-loop会中断,你不会得到任何输出。另一种选择(正如我在评论中指出的那样)是x类型为long(ielong x = ...) 并让 if-condition 为x > Integer.MAX_VALUE


另外,看看这个:

int n = Integer.MAX_VALUE;
System.out.println(3 * n + 1);
2147483646

显然存在溢出,但结果3*n + 1仍然是肯定的。


最后,您的前两个语句似乎有问题if(第二个应该是一个else if),如另一个答案所示。为了完整起见,我只是提到它。

于 2013-01-22T22:46:32.473 回答
2

目前,您Hailstone sequence将达到一个无休止的序列4, 2, 1, 4, 2, 1, ...因为您拥有多个if's而不是if-else.

您应该将您的设置更改if's为: -

if (x % 2 == 0)
    x = x / 2;
else
    x = x * 3 + 1;
if (x < 0) {   
    System.out.print("The integer " + count + " cannot have its Hailstone sequence computed using int variables. ");
    return;
}

那么,问题是什么?

如果您使用 just if's,那么在某个时间点,您x将成为1由于第一个if条件。

因此,使用x = 1,第二个if将被执行,x现在将变为 - 1 * 3 + 1= 4。然后while循环继续。再次,x变为2( 1stif ),然后再次while循环继续 ( As2nd if现在不满足。2 % 2 != 1 ),然后x变为1( 1stif ),然后变为4( 2ndif ),依此类推。这个问题出现了,因为你的两个if块每次都被执行。


只是为了完成答案,我认为你甚至不需要最后一个条件 - x < 0。您的 while 循环将自动中断 when x becomes 1。这必须是结束序列的唯一条件。因为,一旦你从 value 开始1,你就会进入那个致命的序列。所以,只需删除if (x < 0)部分。不需要。

所以,你应该只使用: -

if (x % 2 == 0)
    x = x / 2;
else
    x = x * 3 + 1;

在你的inner时候。

于 2013-01-22T22:57:07.367 回答