Возможно, на 3 месяца позже, но здесь идет ...
Я вижу, что второй ответ лишил функцию давать вам требуемый ответ, но в ответ на ваш первоначальный вопрос о том, как вы генерируете все факторы, предполагающие, что вам нужно по какой-то причине, вот как вы это делаете:
Предполагая, что у вас есть факторы в массиве:
int [] primeFactors = new int [] {2, 2, 3, 5, 5};
То, что вам нужно сделать, - это повторять каждую перестановку по порядку для каждой возможной глубины, а затем уменьшать результирующий набор результатов только до уникальных значений.
Я объясню, что я имею в виду:
«Перестановка по порядку»: при условии, что вы начинаете с позиции 0 массива, следующий элемент должен быть 1, 2, 3 или 4, если вы начинаете с 1, то следующий должен быть 2, 3 или 4 и т. Д.
«Каждая возможная глубина»: каждый отдельный фактор, затем любые два фактора, затем любые три фактора и так далее, пока не дойдете до всех пяти факторов.
«Уменьшите набор»: если вы берете два элемента, скажем, 0 и 3, 0 и 4, 1 и 3 или 1 и 4, все они дают вам 2 * 5 = 10, все они дают коэффициент 10, поэтому вам нужно сделать так, чтобы ваш набор отличался ценности. (Фу, это становится длиннее, чем я ожидал ...:))
Способ сделать это состоит в том, чтобы использовать два метода: один для выбора максимальной глубины рекурсии, запуска рекуссии и удаления окончательных результатов, а другой для получения значений:
public static void main(String[] args) {
int[] primeFactors = new int[] {2, 2, 3, 5, 5};
List<Integer> allFactors = getAllFactors(primeFactors);
for (int factor : allFactors) {
System.out.println("Factor: " + factor);
}
}
private static List<Integer> getAllFactors(int[] primeFactors) {
Set<Integer> distinctFactors = new HashSet<Integer>();
for (int maxDepth = 0; maxDepth <= primeFactors.length; maxDepth++) {
permutatPrimeFactors(0, maxDepth, 0, 1, primeFactors, distinctFactors);
}
List<Integer> result = new ArrayList<Integer>(distinctFactors);
Collections.sort(result);
return result;
}
private static void permutatPrimeFactors(int depth, int maxDepth, int minIndex, int valueSoFar, int[] primeFactors, Set<Integer> distinctFactors) {
if (depth == maxDepth) {
distinctFactors.add(valueSoFar);
return;
}
for (int index = minIndex; index < primeFactors.length; index++) {
permutatPrimeFactors(depth + 1, maxDepth, index + 1, valueSoFar * primeFactors[index], primeFactors, distinctFactors);
}
}
getAllFactors использует Set, чтобы убедиться, что мы получаем только отдельные значения, затем добавляет их в список и сортирует их так, чтобы мы могли отображать факторы по порядку.
В то время как permutatPrimeFactors генерирует от нулевых терминов (фактор = 1) до всех терминов (фактор = 1 * 2 * 2 * 3 * 5 * 5 = 300).
Надеюсь, это поможет.