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

问题描述 投票:-1回答:2

所以出于某种原因,这给了我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());

    }
 }
java math
2个回答
0
投票

变量iint类型。 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永远是真的。


0
投票

你得到这个错误,因为i导致overflow之后Integer.MAX_VALUE的值将是Integer overflow。你的max是一种long持有值600851475143L(大于Integer.MAX_VALUE),但i是int。所以在某个时间点,由于i0最终将到达overflow并且max % i = 600851475143L/0将抛出错误。为了解决这个问题,我建议制作i类型的长。

   long count = 0;
   for(long i = 1; i < max; i++) {
        if(max % i == 0)count += i;
    }
© www.soinside.com 2019 - 2024. All rights reserved.