while(i&lt; = sqrt(static_cast <double>(n))</double>

时间:2011-01-18 16:27:44

标签: c++ primes sqrt

在“没有恐惧的C ++:让你感觉聪明的初学者指南”一书中,在第(2)章:决策,决定中,您可以看到这段代码作为素数程序的一部分:

while (i<=sqrt(static_cast<double>(n))

前提是“i”初始化为“2”,“n”是用户的输入。

为什么我们要比较“n”的“sqrt”而不是“n”呢?

感谢。

5 个答案:

答案 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)