2010-02-11 81 views
2

我找出哪些NUM分所示,节目最高的主要因素, 有一个与阵列中的问题,并为什么在这个质数检查中得到一个ArrayIndexOutOfBoundsException?

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,
  • 全部推到一个数组,
  • 检查最后一个元素......

对于素数我需要做更多,但我在初始阶段卡住了。

+1

当人们问简单的问题时,我喜欢它,你有六种不同的方式来表达完全相同的东西 - 有趣的观看。 +1 :)玩得开心,选择最佳答案。 – 2010-02-11 17:09:09

回答

1

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

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

2

通过创建数组arr [] = {j},您创建了一个只包含j或1的数组。这意味着数组的长度为1,因为它包含1个元素。因此,arr [1]超出界限。 Java不会动态调整数组大小,因此您必须创建一个足够大的数组来包含您计划保存的所有数据。要么就是要么使用像动态调整大小的ArrayList。

0

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

您创建了该阵列: int arr[] = {j}; 因此该数组只有一个单元格。

您应该至少num/2细胞, 的东西,如 int arr[] = new int[num/2]; arr[0] = j;

+0

因为我的变量num是双倍的,我不能做int [num/2]? – 2010-02-11 16:53:02

+0

@tonio num是一个庞大的数字。 num/2的int数组将为〜1.2 TB。 – 2010-02-11 17:15:32

+0

在这种情况下,您不应该使用数组。而你的程序不使用这个数组中的值,除了最后一个。为什么不简单地使用int值? – tonio 2010-02-12 09:48:31

0

初始化您的数组看起来你开始J = 1和您的阵列只中有一个元素开始,所以在第一次通过你在for循环中寻找arr [1],但是数组中的第一个元素是arr [0]。 Java数组是零索引,这意味着如果数组中有10个元素,它们位于arr [0]到arr [9]中。

3

此行

int arr[] = {j}; 

创建被执行时,它仅包含的j值的数组。你可能想

int arr[] = new int[j]; 

更新:根据您左下方的答案,审判庭的时间过长。 Sieve of Eratosthenes是一个非常有效的经典算法,但Sieve of Atkin是用于查找素数的最先进的算法之一。

相关问题