素数筛(欧式筛)
欧式筛(欧几里得筛法)
这个方法可以保证每个合数在N/M的最小素因子时被筛出,所以时间复杂度仅为O(N)
已经可以满足大部分需求,在竞赛中,这种方法也可以在极短的时间内求出关于N的质数表。
思想:最小质因数 * 最大因数(非自己) = 这个合数
代码
#include <stdio.h>
#include <string.h>
bool book[10000005];
int prime[10000005], p = 0;
int isPrime(int n)
{
memset(book,true,sizeof(book));
book[0] = false;
book[1] = false;
for(int i = 2; i <= n; ++ i){
if(book[i]){
prime[p ++] = i;
}
for(int j = 0; j < p && prime[j] * i <= n; ++ j){
book[prime[j] * i] = false;
if(!i % prime[j]){
break;
}
}
}
return book[10000005];
}
批注
注意这里关于素数筛(欧式筛)的使用(函数部分)
注意bool类型在C++当中才有,C中没有
注意memset函数的头文件为<string.h>