2011-07-15 114 views
0

的因素我想一個組合的算法,...到多個數組中的元素,所有其他元素,但本身....組合數組元素,爲獲得數

請幫我組合例如:: {1,2,3,4,5,6}

輸出:: 1 * 2,1 * 3 .... 1 * 6,1 * 2 * 3!* 2 * 4 .. ..... 1 * 2 * 3 * 4 * 5 * 6 ....... 5 * 6

代碼中刪除這是無關緊要的,以我的問題的邏輯要求...

+0

,如果你想它要快,不要使用'log'或'pow'。 ;)您可能會發現嘗試所有因素的速度更快,因爲它更簡單。 –

+0

@Thomas問題編輯 – CoolEulerProject

+0

@Peter Lawrey,我知道,只是想看看這將如何工作 – CoolEulerProject

回答

1

我相信這是你在找什麼:

//This method return a list of lists, where each "inner list" contains as 
//its first number the number for which the factors are being found, and 
//every other number is a factor. 
//It takes an array of all the numbers whose factor you wish to find 
public List<List<Integer>> getAllFactors(int[] toCalculate){ 
    List<List<Integer>> toReturn = new ArrayList<List<Integer>>(); 
    List<Integer> factors; 
    for(int i = 0; i < toCalculate.length; i++){ 
     factors = new ArrayList<Integer>(); 
     factors.add(toCalculate[i]); //add the number whose factors will be calculated 
     //the square root is used because it is the largest number you can divide by without getting "overlap" 
     for(int j = 1; j <= Math.sqrt(toCalculate[i]); j++){ 
      if(toCalculate[i]%j==0){ //if it divides evenly, add it 
       factors.add(j); 
       factors.add((Integer)toCalculate[i]/j); //also add its "partner" number 
      } 
     } 
     toReturn.add(factors); 
    } 
    return toReturn; 
} 

我把Test類...這裏是我的測試方法:

public static void main(String[] args){ 
    Test t = new Test(); 
    List<List<Integer>> blah = t.getAllFactors(new int[]{10, 12, 1, 5}); 
    for(List<Integer> i: blah) 
     System.out.println(Arrays.toString(i.toArray(new Integer[i.size()]))); 
} 

我意識到,這不是什麼問題要求...我想...我真的不知道... 無論如何,我寫了一個替代方法:

public List<Integer> getAllFactors(int number){ 
    List<Integer> factors = new ArrayList<Integer>(); 
    for(int i = 2; i <= Math.sqrt(number); i++){ 
     if(number%i==0){ 
      factors.add(number); 
      factors.addAll(getAllFactors(i)); 
      factors.addAll(getAllFactors(number/i)); 
     } 
    } 
    if(factors.isEmpty()) 
     factors.add(number); 
    return factors; 
} 

但後來我意識到,可能不是你想要的。事實是,我其實並沒有想到你要找的東西,我無法理解你的帖子。我剛剛試圖從評論中收集信息。

+0

哦,對不起,我的互聯網連接被打破,你的第一個答案本身會滿足我的查詢,這是一段偉大的代碼,我累了類似的東西,但只是更多的代碼行...... – CoolEulerProject

+0

謝謝,很多.... – CoolEulerProject

+0

和第二個評論也是一個很大的幫助,謝謝 – CoolEulerProject

1

爲什麼不只是宣佈arr作爲Set fr開始?

Set<Integer> arr = new LinkedHashSet<Integer>(); 

讓它在那。你永遠不想重複,如果順序很重要,LinkedHashSet保留插入順序。

+0

好的,謝謝,好點,我會修改它,可以讓你有效地結合的方式... – CoolEulerProject

1

首先,找到因素。這是我自己的代碼片段。它在稱爲factorsArrayList中構建了target的因子列表。由於每個因素都被發現,它會被記錄一次,並根據需要劃分出多少次。然後相應地降低上限。變量residue包含target的未構造部分。

int trialFactor = 0; 
int residue = target; 
limit = iSqrt(residue); 
while (trialFactor < limit) { 
    trialFactor = nextPrime(trialFactor); 
    if (residue % trialFactor == 0) { 
     factors.add(trialFactor); 
     do { 
      // Remove repeated factors. 
      residue /= trialFactor; 
     } while (residue % trialFactor == 0); 
     limit = iSqrt(residue); 
    } 
} 
// Record largest factor, if present. 
if (residue > 1) { factors.add(residue); } 

有兩個我自己的功能使用:

int nextPrime(int)返回下一個最大的素數。

int iSqrt(int)它返回整數平方根; iSqrt(10)返回3

現在對於你的問題,組合的第二部分。你有一組物品,你想要所有可能的組合。如果有n個項目,則只需遍歷所有數字0到(2^n) - 1.這將爲您提供從000 ... 000到111 ... 111的所有位模式。對於組中的每個位置, '0'表示不包含在你的輸出中,'1'表示包含它。

因此,考慮到您的{1,2,3,4,5,6}例如,從0到2^6需要號碼 - 1 = 63取一個例子,45是二進制101101,所以你的輸出45是{1,3,4,6}。

+0

謝謝,但它是如何得到4(2 * 2),8( 2 * 2 * 2),15(3 * 5); – CoolEulerProject

+0

它只是計算數字的主要因素....並非所有因素,我需要所有因素 – CoolEulerProject

+0

然後記錄所有的主要因素,包括重複。在內部do循環中移動'factors.add(trialFactor);'行。係數4會記錄爲{2,2} – rossum