数组中元素的组合,用于获取数字因子

时间:2011-07-15 13:18:53

标签: java combinations

我想要一个组合算法,......要将数组中的元素多个,除了它自己之外的所有其他元素......

请帮我组合eg :: {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

代码被删除它与我对问题的逻辑要求无关......

3 个答案:

答案 0 :(得分:1)

为什么不从一开始就将arr声明为Set

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

然后离开它。您永远不会想要重复,如果订单很重要,LinkedHashSet会保留插入顺序。

答案 1 :(得分:1)

首先,找到因素。这是我自己代码中的一个片段。它会在名为target的{​​{1}}中构建ArrayList因子列表。当找到每个因子时,它被记录一次并根据需要分出多个时间。然后相应地降低上限。变量factors包含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)返回3.

现在问题的第二部分,组合。你有一组物品,你想要所有可能的组合。如果有n项,则只需遍历所有数字0到(2 ^ n) - 1.这将为您提供从000 ... 000到111 ... 111的所有位模式。对于组中的每个位置a “0”表示不将其包含在输出中,而“1”表示包含它。

所以,考虑到你的{1,2,3,4,5,6}示例,你需要从0到2 ^ 6 - 1 = 63的数字。举一个例子,45是二进制的101101,所以你的输出为45是{1,3,4,6}。

答案 2 :(得分: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;
}

然后我意识到这可能不是你想要的。事实是,我实际上没有任何想法,你无法理解你的帖子。我一直试图从评论中收集信息。