http://blog.youkuaiyun.com/tc_to_top/article/details/48025849
素数筛模版
#include <iostream>
#include <cstdio>
#include <cstring>
#include <ctime>
#include <vector>
using namespacestd;
const int maxn =1e7 + 1;
int prime[maxn /10],primesz = 0;
bool isprime[maxn];//0表示是素数
void getprime(int sz)//线性筛
{
for (int i =2; i < sz; i ++) {
if(!isprime[i])prime[primesz ++] = i;
for (int j =0; j < primesz && prime[j] * i < maxn; j ++) {
isprime[prime[j] * i] =true;//让每个合数被他的最小质因子筛掉
if(i %prime[j] == 0)break;
}
}
}
void f(int sz)
{
isprime[0] =isprime[1] =1;
for (int i =2; i < sz; i ++) {
if(!isprime[i]) {prime[primesz ++] = i;
for (longlong j = 1ll * i * i; j <maxn; j += i) {
isprime[j] =1;
}
}
}
}
int main()
{
clock_t s,t;
memset(isprime,0, sizeof(isprime));
s = clock();
getprime(maxn);
t = clock();
printf("线性筛 %lf\n",(double)(t - s) / CLOCKS_PER_SEC);
printf("%d\n",primesz);
memset(isprime,0, sizeof(isprime));primesz = 0;
s = clock();
f(maxn);
t = clock();
printf("埃氏筛 %lf\n",(double)(t - s) / CLOCKS_PER_SEC);
printf("%d\n",primesz);
return0;
}
线性筛 0.1572611e7时比埃氏筛快大概50%
664579
埃氏筛 0.227290
664579