我正在尝试使我的冰雹序列输出为由于对 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 ++;
}
}
看看你到底在做什么。您的打印语句位于条件为 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
),如另一个答案所示。我只是为了完整起见而提到它。
目前,您的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
将由于第一个if
条件而变得1
。
因此,使用 x = 1
,将执行第 2 个if
,x
现在将变为 - 1 * 3 + 1
= 4
。然后 while 循环继续。同样,x
变得2
(第 1 if
次),然后再次while
循环继续(因为2nd if
现在不满意。 2 % 2 != 1
),然后x
变为1
(第 1 if
),然后变为4
(第 2 if
),依此类推。出现此问题是因为您的两个if
块每次都会被执行。
只是为了完成答案,我认为你甚至不需要最后一个条件 - x < 0
.您的 while 循环将在x becomes 1
时自动中断。而这一定是结束序列的唯一条件。因为,一旦你从价值1
开始,你最终会陷入那个致命的序列。因此,只需删除if (x < 0)
部分即可。 不需要。
因此,您应该只使用: -
if (x % 2 == 0)
x = x / 2;
else
x = x * 3 + 1;
在你的inner
一会儿。