代码之家  ›  专栏  ›  技术社区  ›  Abhilash Muthuraj

为什么在这个质数检查中得到arrayindexoutofboundsException?

  •  2
  • Abhilash Muthuraj  · 技术社区  · 15 年前

    我发现了划分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,
    • 把所有的都推到一个数组中,
    • 检查最后一个元素……

    在初级阶段,我需要做更多的工作,但我还停留在初级阶段。

    5 回复  |  直到 10 年前
        1
  •  1
  •   President James K. Polk    15 年前

    看起来你找到了所有的除数 num 其中之一将是最大的主要因素。只有两个相关的事实有助于使这个问题对少数人容易处理:
    1。如果 d 是除数,那么也是 num/d .
    2。你不需要检查任何大于 sqrt(num) .

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

        2
  •  3
  •   Hank Gay    15 年前

    这条线

    int arr[] = {j};
    

    创建一个数组,该数组只包含 j 执行时。你可能想要

    int arr[] = new int[j];
    

    更新:根据您在下面留下的答案,审判部门花费了太长时间。这个 Sieve of Eratosthenes 是一个非常有效的经典算法,但是 Sieve of Atkin 是寻找素数最先进的算法之一。

        3
  •  2
  •   bkritzer    15 年前

    通过创建数组arr[]=j,您已经创建了一个仅包含j或1的数组。这意味着数组的长度是1,因为它包含1个元素。因此,arr[1]超出了界限。Java不动态地调整数组大小,因此必须创建足够大的数组来包含所有要保存的数据。或者使用类似arraylist的东西,它可以动态调整大小。

        4
  •  0
  •   tonio    15 年前

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

    创建数组时使用了: int arr[] = {j}; 因此,数组只有一个单元。

    至少应使用以下命令初始化数组 num/2 细胞, 有点像 int arr[] = new int[num/2]; arr[0] = j;

        5
  •  0
  •   Daniel    15 年前

    看起来您开始j=1,并且数组中只有一个元素要开始,所以在第一次通过for循环时,您会查找arr[1],但数组中的第一个元素位于arr[0]。Java数组是零索引的含义,如果在数组中有10个元素,它们位于ARR(0)到ARR(9)中。