Euler014比int长了很长时间

mk_*_*mk_ 1 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 6

这是因为你已经满溢的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循环中.