如果我运行下面的代码,则完成时间不到1秒.
如果我将序列从long更改为int,则需要超过10分钟.
为什么?
long sequenceLength = 0;
long startingNumber = 0;
long sequence;
for (int i = 2; i <= 1000000; i++) {
int length = 1;
sequence = i;
while (sequence != 1) {
if ((sequence % 2) == 0) {
sequence = sequence / 2;
} else {
sequence = sequence * 3 + 1;
}
length++;
}
//Check if sequence is the best solution
if (length > sequenceLength) {
sequenceLength = length;
startingNumber = i;
}
}
Run Code Online (Sandbox Code Playgroud)
这是因为你已经满溢的int范围,所以它的循环一个很多更与int总比long秒.请参阅我在Stack Overflow上的其他答案,以获得更详细的解释,了解Euler014 long在您使用的范围内对Java的要求(巧合的是,这是其他提问者使用的范围).
使用更新的变量名称从该答案中引用:
在链中的某一点上,
sequence是827,370,449你跟随sequence = sequence * 3 + 1分支.这个价值想成为2,482,111,348,但它溢出了int(正2,147,483,647处于正面领域)的能力并带你去-1,812,855,948.
所以你要保持循环很长一段时间等待sequence回到1你的while循环中.