1

如果我运行下面的代码,只需不到 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;
    }
}
4

2 回答 2

6

这是因为你已经超出了int范围,所以它用s 循环比s 循环更多。请参阅我在 Stack Overflow 上的其他答案,以更详细地解释为什么 Euler014 要求Java 在您使用的范围内(巧合的是,这是其他提问者使用的范围)。intlonglong

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

在链中的某一点,sequence827,370,449,你跟随sequence = sequence * 3 + 1分支。该值想要成为2,482,111,348,但它溢出了int2,147,483,647在积极领域中)的容量并带您到-1,812,855,948

所以你一直循环很长一段时间,等待sequence回到1你的while循环中。

于 2013-07-16T17:25:18.710 回答
3

随便猜?我怀疑溢出行为是不同的。如果任何中间结果超过 2^31 - 1,则 anint将溢出为负数,通常会有不同的结果。

于 2013-07-16T17:25:20.927 回答