[英]Why is this giving me an Arithmetic Error in java?
所以出於某種原因,這給了我除以 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
的值將在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;
}
變量i
的類型為int
。 int
的最大值是(2^31) - 1 = 2147483647
。 當您將最大int
值加 1 時,它將溢出,成為最小 int 值 ( -2^31 = -2147483648
)。 這被稱為環算術,繼續給這個變量加 1,它最終會變成0
,導致DivisionByZeroException
(記住, 除法和模數是語義耦合的)。
順便說一句:通過同樣的推理,您可以看到i < max
將始終為真。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.