如果我运行下面的代码,则完成时间不到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;
}
}
答案 0 :(得分:6)
这是因为你已经超出了int
范围,所以它使用int
s而不是long
来循环很多。有关Euler014在您使用的范围内需要long
的原因的更详细说明,请参阅my other answer here on Stack Overflow(巧合的是,这是其他提问者使用的范围)。
使用更新的变量名称从该答案中引用:
在链中的某一点,
sequence
为827,370,449
并且您遵循sequence = sequence * 3 + 1
分支。该值希望为2,482,111,348
,但它会溢出int
(正面领域为2,147,483,647
)的容量,并带您进入{{1} }。
因此,您需要长时间循环,等待-1,812,855,948
在sequence
循环中回到1
。
答案 1 :(得分:3)
猜猜?我怀疑溢出行为是不同的。如果任何中间结果超过2 ^ 31 - 1,那么int
将溢出为负数,这通常会产生不同的结果。