素数判断和素数筛(简单方便)
一个数是不是素数就要看它能否被另一个大于1且小于本身的数整除即可;
我们在寻找素数的过程中发现了素数的一个性质:
素数:————>分布在6的两侧(2,3是特殊情况要特判)
证明:6x %6==0
6x+1
(6x+2)%2==0
(6x+3)%3==0
(6x+4)%2==0
6x+5
但是这是一个必要条件:是素数则有这个性质,因为存在(6x+1)*(6x+5)这样的素数也满足这样的条件,所以在下列if 判断语句后还有for循环进行另一步判断
#include<iostream> #include<cmath> using namespace std; bool Isprime(int num) { if(num<=3)return num>1;//特判1,2,3 if(num%6!=1&&num%6!=5)//是否位于6两侧,既不在六的左边也不在六的右边注意用&&。 return false; int eps=sqrt(num); for(int i=5;i<=eps;i+=6)//是否能被素数整除;一定是<= 。。。。不然会出错;例如323 if(num%i==0||num%(i+2)==0)//能被六左侧数整除或者被六右侧数整除注意用||。 return false; return true; }
Eratosthenes筛法
int v[MAXN]; void primes(int n) { memset(v,1,sizeof(v));// v[0]=0,v[1]=0; for(int i=2;i<=n;i++) { if(!v[i])continue; for(int j=i;j<=n/i;j++) v[i*j]=0;//合数是0 } }
从二开始,是合数则跳过,否则就从i^2开始枚举标记合数,从i^2开始枚举,因为i^2以下的数都已经被枚举过