簡體   English   中英

為什么這會給我一個 java 中的算術錯誤?

[英]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。 因此,在某個時間點,由於overflowi最終會達到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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM