为什么这会给我java中的算术错误?

时间:2019-03-03 17:28:51

标签: java math

所以由于某种原因,这让我被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());

    }
 }

2 个答案:

答案 0 :(得分:0)

由于ioverflow的值将在Integer.MAX_VALUE之后为Integer overflow,您将收到此错误。您的max是一种long持有值600851475143L(大于Integer.MAX_VALUE),但i是整数。因此,在某个时间点,由于i0最终将达到overflow,并且max % i = 600851475143L/0将引发错误。为了解决该问题,我建议将i类型设置为long。

   long count = 0;
   for(long i = 1; i < max; i++) {
        if(max % i == 0)count += i;
    }

答案 1 :(得分:0)

变量i的类型为intThe maximum value of an int is (2^31) - 1 = 2147483647。当您将最大int值加1时,它将溢出,成为最小int值(-2^31 = -2147483648)。这称为ring arithmetic,继续向此变量添加1,最终它将变为0,从而产生DivisionByZeroException(记住,division and modulus are semantically coupled)。

顺便说一句:出于同样的原因,您可以看到i < max将永远为真。