今天我使用projecteulers
问题练习编码测试。在做主要因素分工时,我偶然发现了一些我觉得奇怪的东西。以下是相关代码(res
是一个ArrayList):
for (int x = 2; x <= n; x++){
if (n % x == 0){
System.out.println("Prime found: " + x);
res.add(x);
n = n / x;
}
}
将1000分为[2,4,5,25]。
过了一会儿,我尝试用if
循环替换while
- 语句,然后打印出正确答案[2,2,2,5,5,5]。
显然有一些我不理解的东西,有人可以向我解释一下吗?
编辑:
较新的代码:
for (int x = 2; x <= n; x++){
while (n % x == 0){
System.out.println("Prime found: " + x);
res.add(x);
n = n / x;
}
}
答案 0 :(得分:3)
区别在于:
if
,则每个号码只会测试一次。所以,如果你能够拿出2,你只能尝试一次。您可以提取的下一个数字是4,尽管它不是素数。
同样适用于5分。 25。while
,则会对每个号码进行测试,直到您知道它不再是要测试的号码。答案 1 :(得分:1)
您也可以将其更改为
for (int x = 2 ; x <= n/x ; ) {
if (n % x == 0) {
System.out.println("Prime factor: " + x);
res.add(x);
n = n / x;
}
else {
x++; // increment moved here
}
}
if (n > 1) {
System.out.println("Prime factor: " + n);
res.add(n);
}
我还更改了终止条件,以便在n
最大素数因子本身很大的情况下更有效率,因为如果n = a*b
和a <= b
,那么a*a <= a*b = n
,即a <= n/a
。
这重复了一个素数因子的测试,因为正如你所发现的,一些数字具有相同幅度的多个素因子(如1000 = 2 * 2 * 2 * 5 * 5 * 5)。它等同于您的while
循环,因为增量现在是有条件的,仅在被测试的候选者不是n
因子时执行。