2015-11-19 42 views
0

我已经给出了下面的代码,它传递一个数字来检查它是否是素数。我不明白什么floor(sqrt(toCheck)) +1做什么或prb变量做什么。我认为它运行while循环,而bool noFactorFound为true,prb小于searchLimit。如果我知道searchLimit是如何初始化的,那么一切都会落空。寻找一个素数的代码C++

#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

[sqrt()](http://en.cppreference.com/w/cpp/numeric/math/sqrt),[floor()](http://en.cppreference.com/w/cpp/)数字/数学/楼) –

回答

1

的原因用于初始化搜索限制到sqrt(N)+1是,如果一个数比sqrt(N)+1较大划分N,则数小于sqrt(N)+1也会将其划分,如发生因素对(除了sqrt(N),它是包含在搜索范围内)。

sqrt函数查找数字的平方根。 Floor将浮点数舍入为低于浮点数的最大整数。

+1是为了避免由于floor函数四舍五入造成的数字遗漏。另一种方法是使用ceil函数,而不需要+1。

1

当您正在查找数字的因素时,不需要查找大于该数字的平方根的数字。所以最终当我们循环时,我们只希望增加与平方根一样多的索引。

floor(sqrt(toCheck)) + 1; 

这需要toCheck的平方根。但是sqrt返回一个浮点数,我们的循环索引是整数unsigned s,所以我们把这个非小数部分与floor相加,然后加上一个来避免错过一个因数,如果这是通过舍入发生的。

大部分情况可以通过仔细阅读文档来了解,所以我建议在遇到类似问题时这样做。