2017-06-17 31 views
1

我有一個計算給定數字範圍的素數因子的算法。 例如在10和20之間。使用嵌套數組顯示素數因子或其他操作的數量

結果是:數字10:因素是:2,5.數字11:因素是:11.數字12:因素是:2,6等等......。

但是我想查看哪些數字只有2或3或4或更多的素因子。

這些數字我存儲在一個數組中。我的想法是將這些單獨的素數因子分配給一個給定的數字。所以我應該有一個arraylist可能,這是動態變化(作爲大小的名稱也)。

例如:

ArrayOfNumbers [0] = 10;
ArrayOfPrimeFactorsOf Number [0] = 2; ArrayOfPrimeFactorsOf Number [1] = 5;

ArrayOfNumbers [1] = 11; ArrayOfPrimeFactorsOf Number [0] = 11;

我可以比較其數目具有例如2或3的素因子=>通過獲得的素因子(ArrayOfPrimeFactorsOf..Number)屬於一個數字陣列(ArrayOfNumbers)的陣列的大小和顯示這些數目也是其主要因素。

我的問題是:我怎樣才能使這個嵌套數組(ArrayOfPrimeFactorsOf..Number)並將其分配給ArrayOfNumbers [..]?

也許你有任何其他的想法如何解決這個挑戰?

下面的程序:

public static void countPrimeFactors() { 

    int min = 10; // min number in array 
    int max = 20; // max number in array 

    Integer[] arrayOfNumbers = new Integer[100000]; 

    for (int a = 0; a < arrayOfNumbers.length; a++) { 

     for (int k = min; k <= max; k++) { 

      arrayOfNumbers[a] = k; 
      System.out.print(arrayOfNumbers[a] + ": "); 

      if (arrayOfNumbers[a] % 2 == 0) { 

       System.out.print(2 + " "); 
       arrayOfNumbers[a] /= 2; 

      } 
     // n must be odd at this point. So we can 
     // skip one element (i = i +2) 
      // i is a current factor 
      // array[a] is a current number 

     for (int i = 3; i <= Math.sqrt(arrayOfNumbers[a]); i += 2) { 
      // While i divides n, print i and divide n 
      if (arrayOfNumbers[a] % i == 0) { 

       System.out.print(i + " "); 
       arrayOfNumbers[a] /= i; 
      } 

     } 

     // This condition is to handle the case when 
     // n is a prime number greater than 2 
     if (arrayOfNumbers[a] > 2) 

      System.out.print(arrayOfNumbers[a] + " , "); 

     } 
     break; 
    } 

    System.out.print("Length of array[a]: " + arrayOfNumbers.length); 
} 

回答

0

我覺得用地圖將是這個最佳的解決方案,TreeMap中尤其是關鍵的應該是數量,而您正在尋找的因素,和值應該是一些其他包含所有功能的集合。例如:

Map<Integer, Set<Integer>> numbers = new TreeMap<>(); 
      int min = 10; 
    int max = 20; 
    Map<Integer, Set<Integer>> numbers = new TreeMap<>(); 
    for (int i = min; i <= max; i++) { 
     Set<Integer> factors = new TreeSet<>(); 
     for (int j = 2; j <= i/2; j++) { 
      if (i % j == 0) { 
       factors.add(j); 
      } 
     } 
     //factors.add(i); 
     numbers.put(i, factors); 

    } 
    System.out.println(numbers.get(11).size()); 
    System.out.println(numbers.values()); 

這是一般的想法,你可以很容易地通過numbers.get(someNumber).size();

得到那麼的因素,每個號碼數字。如果取消註釋factors.add(i);然後數我們發現的因素會被計算在內,如果你需要這種方式。

迭代

// Iterator mapIt = numbers.keySet().iterator(); - you can only iterate thru map by using iterator 

    for(int i = min; i <= max; i++){ 
     Iterator it = numbers.get(i).iterator(); 
     System.out.print("Iterating for number " + i+": "); 
     while(it.hasNext()){ 
      System.out.print(it.next()+" "); 
     } 
     System.out.println(); 
    } 

這應該給你全面的瞭解,如果你不喜歡使用迭代器,然後使用ArrayList而不是設置,像Map<Integer, List<Integer>>

+0

謝謝您的答覆。它向我展示了具體數字的所有可能因素。但是我怎麼能在Map中迭代這些因素呢?例如:編號12:[2,3,4,6,12]。我想在這個Map中迭代來檢查是否有兩個因素可以創建這個數字(12)。 – gryzek

+0

您正在通過值獲取Map的元素,因此numbers.get(someNumber)會爲您提供Set中包含該數字的因素,您使用迭代器遍歷集合,如果您不熟悉它,則可能會更容易使用'array'或'ArrayList',將在幾分鐘內添加代碼。 – FilipRistic

+0

謝謝。它幫助我更多:) – gryzek