Java Euler014使用int比使用long花费更长的时间

Java Euler014使用int比使用long花费更长的时间,java,int,Java,Int,如果我运行下面的代码,它需要不到1秒的时间来完成 但是,如果我将序列从long更改为int,则需要10分钟以上的时间 为什么? long sequenceLength=0; 长启动数=0; 长序列; for(int i=2;i sequenceLength){ sequenceLength=长度; 起始编号=i; } } 这是因为您溢出了int范围,因此它使用ints比longs循环了很多。有关为什么Euler014要求Java在您使用的范围内使用long的更详细解释,请参见(巧合的是,这是另一

如果我运行下面的代码,它需要不到1秒的时间来完成

但是,如果我将序列从long更改为int,则需要10分钟以上的时间

为什么?

long sequenceLength=0;
长启动数=0;
长序列;
for(int i=2;i sequenceLength){
sequenceLength=长度;
起始编号=i;
}
}

这是因为您溢出了
int
范围,因此它使用
int
s比
long
s循环了很多。有关为什么Euler014要求Java在您使用的范围内使用
long
的更详细解释,请参见(巧合的是,这是另一位提问者使用的范围)

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

在链中的一个点上,
sequence
827370449
,您遵循
sequence=sequence*3+1
分支。该值希望为
2482111348
,但它超出了
int
的容量(在正域中为
2147483647
),并将您带到
-1812855948


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

这是因为你溢出了
int
范围,所以它循环的
long
更多。有关为什么Euler014要求Java在您使用的范围内使用
long
的更详细解释,请参见(巧合的是,这是另一位提问者使用的范围)

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

在链中的一个点上,
sequence
827370449
,您遵循
sequence=sequence*3+1
分支。该值希望为
2482111348
,但它超出了
int
的容量(在正域中为
2147483647
),并将您带到
-1812855948


所以你一直循环很长一段时间,等待
序列在
循环中回到
1

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

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

查看序列为int时是否超出范围。您可以通过在下面打印它来发现这一点zero@PragalathanM:是的,当
sequence
达到827370449时,它遵循
sequence=sequence*3+1
路径。当序列为int时,查看序列是否超出范围。您可以通过在下面打印它来发现这一点zero@PragalathanM:是的,当
sequence
达到827370449时,它遵循
sequence=sequence*3+1
路径。
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;
    }
}