为什么我在此素数检查中得到ArrayIndexOutOfBoundsException?

时间:2010-02-11 16:45:12

标签: java arrays

我找到了除以num的最高素因子,如程序所示, 数组和

存在问题
arr[j] = i;
j++;
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
    at primenum.main(primenum.java:13)
//to find highest prime factor
public class primenum {
    public static void main(String[] args) {
          double num = 600851475143.0;
           int j = 1;
          int arr[] = {j};

          for(int i=2; i<=num/2; i++)
          {
              if((num%i) == 0 )
              {
                  arr[j] = i;
                  j++;
              }

          }
          // take the last item from array, coz its last big prime
          System.out.println("largest prime is "+ arr[j-1]);

    }
}

解决这个问题的最佳方法是什么?

我正在解决这个问题,

  • 检查因子直到num / 2,
  • 将all全部推入数组
  • 检查最后一个元素......

对于素数我需要做更多,但我已陷入初始阶段。

5 个答案:

答案 0 :(得分:3)

这一行

int arr[] = {j};

创建一个仅在执行时包含j值的数组。你可能想要

int arr[] = new int[j];

更新:根据你在下面留下的答案,试验师花了太长时间。 Sieve of Eratosthenes是一种非常有效的经典算法,但Sieve of Atkin是用于查找素数的最先进算法之一。

答案 1 :(得分:2)

通过创建数组arr [] = {j},您创建了一个只包含j或1的数组。这意味着数组的长度为1,因为它包含1个元素。因此,arr [1]超出范围。 Java不会动态调整数组大小,因此您必须创建一个足够大的数组来包含您计划保存的所有数据。或者使用类似ArrayList的东西,它可以动态调整大小。

答案 2 :(得分:1)

看起来你找到num的所有除数;其中一个将是最大的主要因素。仅有两个相关事实应该有助于使问题易于处理小数字:
1.如果d是除数,那么num/d也是如此 2.您无需检查任何大于sqrt(num)的除数。

要跟踪除数,请使用Set对象。

答案 3 :(得分:0)

java中的数组不是列表:一旦分配,你的数组就不会神奇地增长。

您使用以下方法创建了数组: int arr[] = {j}; 因此,阵列只有一个单元格。

您应该使用至少num/2个单元格初始化数组, 喜欢的东西 int arr[] = new int[num/2]; arr[0] = j;

答案 4 :(得分:0)

看起来你启动j = 1并且你的数组中只有一个元素要开始,所以在第一次通过你的for循环时你会找到arr [1],但是数组中的第一个元素是arr [ 0]。 Java数组是零索引的,这意味着如果数组中有10个元素,它们位于arr [0]到arr [9]中。