2010-02-11 77 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是用於查找素數的最先進的算法之一。

相關問題