如果vs pro while循环in projecteuler-3素因子分裂

时间:2016-03-07 14:18:52

标签: java if-statement while-loop primes prime-factoring

今天我使用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;
    }       
}

2 个答案:

答案 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*ba <= b,那么a*a <= a*b = n,即a <= n/a

这重复了一个素数因子的测试,因为正如你所发现的,一些数字具有相同幅度的多个素因子(如1000 = 2 * 2 * 2 * 5 * 5 * 5)。它等同于您的while循环,因为增量现在是有条件的,仅在被测试的候选者不是n因子时执行。