【发布时间】:2016-08-16 14:36:45
【问题描述】:
我试图制作一种方法来对数字进行素数分解,它可能不是最有效的,但我不明白为什么它不应该工作。
public static ArrayList<Integer> primeFactorize(int num) {
ArrayList<Integer> primeFactors = new ArrayList<Integer>();
for (int i = 2; i < Math.sqrt((double) num); i++) {
if (isPrime(i) && factor(num).contains(i)) {
primeFactors.add(i);
num /= i;
if (isPrime(num)) {
primeFactors.add(num);
break;
}
i = 2;
}
}
return primeFactors;
}
它调用了我编写的另外两个方法,名为 factor() 和 isPrime(),它们完全符合您的预期(返回因子的 ArrayList 和 true 或 false,具体取决于是否输入分别为素数)。
我通过调试器,num 为 12,它在第一个循环中运行良好,它将 2 添加到 primeFactors。然而,当它再次到达数组顶部时,num 为 6,i 为 2,它退出了循环,就好像i < Math.sqrt((double) num) 返回了false。
但这没有意义,因为 6 的平方根略大于 2。我也尝试了 (double) i < Math.sqrt((double) num),但它只是做了同样的事情。
谁能看到我错过了什么?感谢您的任何回复。
编辑:这是我的代码,感谢您的帮助!我确信我可以提高效率,所以我以后可能会这样做,但现在这是完美的。
public static ArrayList<Integer> primeFactorize(int num) {
ArrayList<Integer> primeFactors = new ArrayList<Integer>();
int i = 2;
while (i < Math.sqrt((double) num)) {
if (isPrime(i) && num % i == 0) {
primeFactors.add(i);
num /= i;
if (isPrime(num)) {
primeFactors.add(num);
break;
}
i = 2;
}
else
i++;
}
return primeFactors;
}
【问题讨论】:
-
sqrt(num),而不是 sqrt(i)。所以当 num=12 时,6 大于 sqrt(num)