Java Euler014使用int比使用long花费更长的时间
如果我运行下面的代码,它需要不到1秒的时间来完成 但是,如果我将序列从long更改为int,则需要10分钟以上的时间 为什么?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的更详细解释,请参见(巧合的是,这是另一
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;
}
}