我已经获得了下面的代码,它传递一个数字来检查它是否是素数。我不明白floor(sqrt(toCheck)) +1
做了什么或prb
变量做了什么。我认为它运行while循环,而bool noFactorFound
为true且prb小于searchLimit
。如果我知道searchLimit是如何初始化的,那么一切都会到位。
#include<cmath> //for floor() & sqrt()
#include "prime.h"
bool isPrime(unsigned toCheck)
{
if (toCheck== 2)
return true;
if ((toCheck % 2) == 0)
return false;
unsigned prb = 3;
unsigned searchLimit = floor(sqrt(toCheck)) + 1;
bool noFactorFound = true;
while (noFactorFound && (prb<searchLimit))
{
if ((toCheck % prb) == 0)
noFactorFound = false;
else
prb += 2;
}
return (noFactorFound);
}
答案 0 :(得分:1)
将搜索限制初始化为sqrt(N)+1
的原因是,如果大于sqrt(N)+1
的数字除以N
,则小于sqrt(N)+1
的数字也会将其除以,因子成对出现(sqrt(N)
除外,它包含在搜索范围内)。
sqrt
函数查找数字的平方根。 Floor
将浮点数舍入为低于浮点数的最大整数。
完成+1
是为了避免由于floor
函数的四舍五入错过数字。另一种方法是使用ceil
函数,不需要+1。
答案 1 :(得分:1)
当您查找数字的因子时,您不需要查找大于该数字的平方根的数字。因此,当我们循环时,我们希望只增加与平方根一样多的索引。
floor(sqrt(toCheck)) + 1;
这取toCheck
的平方根。但是sqrt返回一个浮点数,我们的循环索引是整数unsigned
s所以我们将非小数部分用floor
然后加一个,以避免错过一个因素,如果发生了通过四舍五入。
通过仔细阅读文档可以找出大部分内容,因此我建议在遇到类似问题时这样做。