一、素数的判断:
①数n,如果不能被【2,n-1】内的所有数整除,n就是素数。
②缩小范围:如果不能被【2,√n】内的所有数整除,n就是素数。
③继续缩小:如果不能被【2,√n】内的所有素数整除,n就是素数。( 时间复杂度为O(√n) )
二、埃式筛法:求区间[2, n]内所有的素数
1、大致思路
2、代码实现
const int MAXN = 1e7; //定义空间大小,1e7约10M
int prime[MAXN+1]; //存放素数,它记录visit[i] = false的项
bool visit[MAXN+1]; //true表示被筛掉,不是素数
int E_sieve(int n) { //埃式筛法,计算[2, n]内的素数
int k=0; //统计素数个数
for(int i=0; i<=n; i++) visit[i]= false; //初始化
for(int i=2; i<=n; i++) { //从第一个素数2开始。
if(!visit[i]) {
prime[k++] = i; //i是素数,存储到prime[]中
for(int j=2*i; j<=n; j+=i) //i的倍数,都不是素数。
visit[j] = true; //标记为非素数,筛掉
}
}
return k; //返回素数个数
}
3、时间复杂度
4、练习