这是寻找素因子的典型代码:
public static List<Integer> primeFactors(int numbers) {
int n = numbers;
List<Integer> factors = new ArrayList<Integer>();
for (int i = 2; i <= n / i; i++) {
while (n % i == 0) {
factors.add(i);
n /= i;
}
}
if (n > 1) {
factors.add(n);
}
return factors;
}
我的问题是为什么在将它添加到列表之前我们不检查我是否是素数?
答案 0 :(得分:4)
我们可以通过矛盾来证明这不会发生。
想象一下,某些复合数字会被添加到列表中。必须有一些最小复合数字添加到列表中。我们称之为c,并想象它的最小素数因子是p。我们知道p&lt; c,所以循环必须在用c运行之前用p运行。当循环确实用p运行时,我们知道循环会发现p是数n的除数,因为p是c的除数,c是n的除数。但是在这样做之后,代码将通过分割出p的所有副本来更新n。这意味着当我们到达循环在数字c上运行的部分时,数字c将不再分割n,因为p除以c,但是p不会除以n的新值(记住,我们将所有p)的副本。因此,c不会被添加到列表中 - 这是一个矛盾!
答案 1 :(得分:1)
这里我们不需要检查天气数量是否为素数因为 要添加的数字肯定是素数..让我们举一些例子
1)16它是2,4,8,16的倍数,但由于while循环而只添加了2
2)18它的倍数是2,3,6,9和18但是因为while循环而只添加了2,3和3
3)n整数 我们不知道它的多重但是 当i = 2时,数字变为奇数,所以现在所有偶数都被消除(意味着任何数字的倍数不能被n / 2整除)
当i = 3时,如果mod为零,则添加并且三个中的所有三个得到消除 (表示3的倍数不能被n / 3整除)
这就是我们如何计算数字是否为素数,例如将数字除以2然后它也不是4,6,8等的倍数
在排序中我们除了用小数字除以之外的其他数字
我希望你理解逻辑