Euler014比int长了很长时间

时间:2013-07-16 17:22:55

标签: java int

如果我运行下面的代码,则完成时间不到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;
    }
}

2 个答案:

答案 0 :(得分:6)

这是因为你已经超出了int范围,所以它使用int s而不是long来循环很多。有关Euler014在您使用的范围内需要long的原因的更详细说明,请参阅my other answer here on Stack Overflow(巧合的是,这是其他提问者使用的范围)。

使用更新的变量名称从该答案中引用:

  

在链中的某一点,sequence827,370,449并且您遵循sequence = sequence * 3 + 1分支。该值希望2,482,111,348,但它会溢出int(正面领域为2,147,483,647)的容量,并带您进入{{1} }。

因此,您需要长时间循环,等待-1,812,855,948sequence循环中回到1

答案 1 :(得分:3)

猜猜?我怀疑溢出行为是不同的。如果任何中间结果超过2 ^ 31 - 1,那么int将溢出为负数,这通常会产生不同的结果。