的因素我想一個組合的算法,...到多個數組中的元素,所有其他元素,但本身....組合數組元素,爲獲得數
請幫我組合例如:: {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
代碼中刪除這是無關緊要的,以我的問題的邏輯要求...
的因素我想一個組合的算法,...到多個數組中的元素,所有其他元素,但本身....組合數組元素,爲獲得數
請幫我組合例如:: {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
代碼中刪除這是無關緊要的,以我的問題的邏輯要求...
我相信這是你在找什麼:
//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;
}
但後來我意識到,可能不是你想要的。事實是,我其實並沒有想到你要找的東西,我無法理解你的帖子。我剛剛試圖從評論中收集信息。
哦,對不起,我的互聯網連接被打破,你的第一個答案本身會滿足我的查詢,這是一段偉大的代碼,我累了類似的東西,但只是更多的代碼行...... – CoolEulerProject
謝謝,很多.... – CoolEulerProject
和第二個評論也是一個很大的幫助,謝謝 – CoolEulerProject
爲什麼不只是宣佈arr
作爲Set
fr開始?
Set<Integer> arr = new LinkedHashSet<Integer>();
讓它在那。你永遠不想重複,如果順序很重要,LinkedHashSet保留插入順序。
好的,謝謝,好點,我會修改它,可以讓你有效地結合的方式... – CoolEulerProject
首先,找到因素。這是我自己的代碼片段。它在稱爲factors
的ArrayList
中構建了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}。
謝謝,但它是如何得到4(2 * 2),8( 2 * 2 * 2),15(3 * 5); – CoolEulerProject
它只是計算數字的主要因素....並非所有因素,我需要所有因素 – CoolEulerProject
然後記錄所有的主要因素,包括重複。在內部do循環中移動'factors.add(trialFactor);'行。係數4會記錄爲{2,2} – rossum
,如果你想它要快,不要使用'log'或'pow'。 ;)您可能會發現嘗試所有因素的速度更快,因爲它更簡單。 –
@Thomas問題編輯 – CoolEulerProject
@Peter Lawrey,我知道,只是想看看這將如何工作 – CoolEulerProject