当前位置: 代码迷 >> java >> 为什么这会给我一个 java 中的算术错误?
  详细解决方案

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

热度:110   发布时间:2023-07-25 19:35:40.0

所以出于某种原因,这给了我除以 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值加 1 时,它将溢出,成为最小 int 值 ( -2^31 = -2147483648 )。 这被称为继续给这个变量加 1,它最终会变成0 ,导致DivisionByZeroException (记住, )。

顺便说一句:通过同样的推理,您可以看到i < max将始终为真。

  相关解决方案