查找素数代码c ++

时间:2015-11-19 15:50:10

标签: c++ boolean sqrt floor

我已经获得了下面的代码,它传递一个数字来检查它是否是素数。我不明白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);
}

2 个答案:

答案 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然后加一个,以避免错过一个因素,如果发生了通过四舍五入。

通过仔细阅读文档可以找出大部分内容,因此我建议在遇到类似问题时这样做。