在“没有恐惧的C ++:让你感觉聪明的初学者指南”一书中,在第(2)章:决策,决定中,您可以看到这段代码作为素数程序的一部分:
while (i<=sqrt(static_cast<double>(n))
前提是“i”初始化为“2”,“n”是用户的输入。
为什么我们要比较“n”的“sqrt”而不是“n”呢?
感谢。
答案 0 :(得分:6)
因为你不会得到任何非素数的因子,因为&gt; sqrt(n)(你可能已经找到了另一个较小的因子)。
这是一个非常糟糕的测试,将它写成:
会好得多while (i*i <= n)
答案 1 :(得分:3)
因为如果一个数字具有除自身以外的因子和1,那么这些因子中的至少一个将小于数字的sqrt。
答案 2 :(得分:0)
while (i<=sqrt(static_cast<double>(n))
相当于
while(n >= i*i)
作者选择第一个解决方案的原因可能取决于代码的其他部分。
答案 3 :(得分:0)
代码如下:
i = 2;
while (i <= sqrt(static_cast<double>(n)) {
if (n % i == 0) is_prime = false;
i++;
}
所以循环检查 n 是否可以被 i 整除而没有余数。显然,只需要检查(包括) n 的平方根(因为如果n / p = q
那么n / q = p
)。
答案 4 :(得分:0)
在算法上检查可能的因子直到目标的平方根是正确的。
如果N是一个可能是或不是素数的数字,如果没有因子(不包括1)直到sqrt(N)那么N必须是素数。 sqrt(N)本身可能是它唯一的主要因素(例如9为3 * 3)。
如果我们要测试17是否为素数,我们知道sqrt(17)正好在4以上.2,3和4不分为17所以它必须是素数,因为5更大。
必须如此,因为17/5将小于5并且必须是一个因素,但我们知道没有小于5的因素。
当然,编程当然代码不是最优的,因为你不会使用双精度和平方根,而是像(i * i&lt; = N)