C++ 为什么迭代是由i+;6每次以及为什么情况是i*i<=n对于这个素数测试函数?
基于C++程序的优化校方方法 //如果一个数是素数C++ 为什么迭代是由i+;6每次以及为什么情况是i*i<=n对于这个素数测试函数?,c++,primality-test,C++,Primality Test,基于C++程序的优化校方方法 //如果一个数是素数 #include <bits/stdc++.h> using namespace std; bool isPrime(int n) { // Corner cases if (n <= 1) return false; if (n <= 3) return true; // This is checked so that we can skip // mi
#include <bits/stdc++.h>
using namespace std;
bool isPrime(int n)
{
// Corner cases
if (n <= 1) return false;
if (n <= 3) return true;
// This is checked so that we can skip
// middle five numbers in below loop
if (n%2 == 0 || n%3 == 0) return false;
for (int i=5; i*i<=n; i=i+6)
if (n%i == 0 || n%(i+2) == 0)
return false;
return true;
}
#包括
使用名称空间std;
bool isPrime(int n)
{
//角落案例
如果(n任何复合数都至少有一个小于或等于其平方根的因子。为什么?因为如果它只有一个因子(除自身或一个因子外),等于它的平方根。如果它有两个或两个以上,最小的一个必须小于它的平方根。所以不需要检查大于平方根的数字——如果它不是素数,我们就已经找到了因子
代码在早期检查2或3作为因子。之后,我们只需要检查不是2或3的倍数的因子。因此,在检查5和7之后,我们不需要检查6、8、9或10。因此,在每六个数字中,我们只需要检查不是2或3的倍数的两个。当您搜索素数时,您可以循环通过h所有介于2和你的数字之间的数字,以查看它们是否除以你的数字
for (int i=2; i < n; i=i+1)
if (n%i == 0)
return false;
虽然就我个人而言,我会做一次sqrt()
,而不是每次循环都做一次I*I
。但是对于n
的小值来说,这可能会更慢。链接解释了为什么它会增加6。我会让你回答:一个数字的因子能大于它的平方根吗?
if (n%2 == 0 ) return false;
for (int i=3; i < n; i=i+2)
if (n%i == 0)
return false;
if (n%2 == 0 || n%3 == 0) return false;
for (int i=5; i<n; i=i+6)
if (n%i == 0 || n%(i+2) == 0)
return false;
if (n%2 == 0 || n%3 == 0) return false;
for (int i=5; i*i<=n; i=i+6)
if (n%i == 0 || n%(i+2) == 0)
return false;