所以出于某种原因,这给了我0分误差,任何想法?
package euler;
public class LargePrimeFactor {
public static long max = 600851475143L;
public static int isPrime() {
int count = 0;
for(int i = 1; i < max; i++) {
if(max % i == 0)count += i;
}
return count;
}
public static void main(String[] args) {
System.out.println(max/isPrime());
}
}
变量i
是int
类型。 The maximum value of an int
is (2^31) - 1 = 2147483647
。当你将一个加到最大的int
值时,它会溢出,成为最小的int值(-2^31 = -2147483648
)。这被称为ring arithmetic继续向此变量添加1,它最终将成为0
,导致DivisionByZeroException
(记住,division and modulus are semantically coupled)。
顺便说一下:通过相同的推理,你可以看到i < max
永远是真的。
你得到这个错误,因为i
导致overflow
之后Integer.MAX_VALUE
的值将是Integer overflow
。你的max
是一种long
持有值600851475143L
(大于Integer.MAX_VALUE),但i
是int。所以在某个时间点,由于i
,0
最终将到达overflow
并且max % i
= 600851475143L/0
将抛出错误。为了解决这个问题,我建议制作i
类型的长。
long count = 0;
for(long i = 1; i < max; i++) {
if(max % i == 0)count += i;
}