想象一下素因数是桶里的球。例如,如果您的数字的素因数是 2、2、2、3 和 7,那么您可以采用 0、1、2 或 3 个“球 2”的实例。同样,您可以拿“球 3”0 或 1 次,“球 7”0 或 1 次。
现在,如果你拿“球 2”两次,“球 7”一次,你得到除数 2*2*7 = 28。同样,如果你不拿球,你得到除数 1,如果你拿所有球,你得到除数 2 *2*2*3*7 等于数字本身。
最后,为了获得可以从桶中取出的所有可能的球组合,您可以轻松地使用递归。
void findFactors(int[] primeDivisors, int[] multiplicity, int currentDivisor, long currentResult) {
if (currentDivisor == primeDivisors.length) {
// no more balls
System.out.println(currentResult);
return;
}
// how many times will we take current divisor?
// we have to try all options
for (int i = 0; i <= multiplicity[currentDivisor]; ++i) {
findFactors(primeDivisors, multiplicity, currentDivisor + 1, currentResult);
currentResult *= primeDivisors[currentDivisor];
}
}
现在您可以在上面的示例上运行它:
findFactors(new int[] {2, 3, 7}, new int[] {3, 1, 1}, 0, 1);