我正在尝试使我的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 ++;
}
}
答案 0 :(得分:4)
看看你实际在做什么。您的print语句位于条件为x < 0
的if语句中,但x
从不小于0
。您在x
上执行的两项操作是:x = x / 2
和x = x * 3 + 1
。这些都不能将积极转化为消极。
编辑: 现在我明白x < 0
是为了测试int溢出。请记住,不能保证会发生这种情况,序列可能只会在一个循环中被捕获(并且可能会出现在大多数初始x
中,因为一旦序列到达1
,您就会有这样的循环。 }),虽然如果发生这种情况,你的while
- 循环会中断,你将得不到输出。另一种选择(正如我在评论中指出的那样)是让x
属于long
类型(即long x = ...
)并让if条件为x > Integer.MAX_VALUE
。
另外,看看这个:
int n = Integer.MAX_VALUE;
System.out.println(3 * n + 1);
2147483646
显然有溢出但3*n + 1
的结果仍然是正面的。
而最后,您的前两个if
语句似乎存在问题(第二个应该是else if
),如另一个答案中所示。我只是为了完整起见而提到它。
答案 1 :(得分: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;
}
的一组更改为: -
if's
那么,问题是什么?
如果您仅使用x
,那么在某个时间点,1
会因if
条件而成为x = 1
。
因此,使用if
,第二个x
将被执行,而1 * 3 + 1
现在将变为 - 4
= x
。然后while循环继续。同样,2
变为if
(第一while
),然后再次2nd if
循环继续(由于2 % 2 != 1
不是现在感到满意。x
),然后1
变为if
(第一4
),然后是if
( 第二if
),依此类推。出现此问题,因为您的x < 0
块每次都被执行。
为了完成答案,我认为你甚至不需要最后的条件 - x becomes 1
。您的while循环将在1
时自动中断。这必须是结束序列的唯一条件。因为,一旦从值if (x < 0)
开始,你就会陷入那种致命的序列。所以,只需删除if (x % 2 == 0)
x = x / 2;
else
x = x * 3 + 1;
部分即可。 不需要。
所以,你应该使用: -
inner
在你的{{1}}中。