问题描述
所以出于某种原因,这给了我除以 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());
}
}
1楼
您收到此错误,因为i
的值将在Integer.MAX_VALUE
之后overflow
,因为Integer overflow
。
您的max
是一种long
持有值600851475143L
(大于 Integer.MAX_VALUE),但i
是 int。
因此,在某个时间点,由于overflow
, i
最终会达到0
,并且max % i
= 600851475143L/0
将引发错误。
为了解决这个问题,我建议让i
类型为 long。
long count = 0;
for(long i = 1; i < max; i++) {
if(max % i == 0)count += i;
}
2楼
变量i
的类型为int
。
。
当您将最大int
值加 1 时,它将溢出,成为最小 int 值 ( -2^31 = -2147483648
)。
这被称为继续给这个变量加 1,它最终会变成0
,导致DivisionByZeroException
(记住, )。
顺便说一句:通过同样的推理,您可以看到i < max
将始终为真。