2018.1.24更新。
添加一个学长给的线性筛法(欧拉筛):
从小到大对于每个已知的素数Pj,筛去i * Pj,当i是pi的倍数时后面的停止。
筛去i*pj,也就是用i*pj的最小质因数pj筛去了它。
当i是pi的倍数时后面的停止,也就是让一个数只能由它的最小质因数筛去它。
举例本来60会被2,3,5都筛一遍,但是现在60只会被2筛去(当i为30时筛去)。
bool isPri[maxn];//0为素数,1为合数
int Pri[maxn / 10];//记录素数
void getPri(){
memset(isPri, 0, sizeof(isPri));
isPri[0] = isPri[1] = 1;
int cnt = 0;
for(int i = 2; i < maxn; ++i){
if(!isPri[i]){
Pri[cnt++] = i;
}
for(int j = 0; j < cnt && Pri[j] * i < maxn; ++j){
isPri[i * Pri[j]] = 1;
if(i % Pri[j] == 0){
break;
}
}
}
}
这是慢速的埃氏筛
#define MAXW 1000000
#include <math.h>
int prime[MAXW];
long long i, j, maxw;
int main()
{
prime[0] = 0;
prime[1] = 0;
prime[2] = 1;
while(scanf("%lld",&maxw)!=EOF&&maxw)
{
for(i = 3; i < maxw; i++)//先筛去偶数
prime[i] = (i&1)?1:0;
int t = sqrt(maxw);
for(i = 0; i <= t; i++)//倍数筛
{
if(prime[i])
for(j = i*2; j < maxw; j += i)
prime[j] = 0;
}
j = 0;
for(i = 0; i < maxw; i++) if(prime[i]) j++;
printf("%lld\n", j);
}
return 0;
}
指导的学长说还有很多判断素数方法,以后补充。