实现:
#include<stdio.h>
using namespace std;
const int MAX_N=1e8;
int prime[MAX_N],cnt;
bool st[MAX_N];//使用bool数组节省空间
void is_prime(int n){
for(int i=2;i<=n;++i){
if(!st[i])prime[cnt++]=i;
for(int j=0;prime[j]<=n/i;++j){
st[i*prime[j]]=1;
if(i%prime[j]==0)break;
}
}
}
int main(){
int n;
is_prime(n);
return 0;
}
每个合数只被自己最小的质因子筛去。
现在证明在i%prime[j]==0时需要break:
下面用 S(smaller)表示小于 j 的数,L(larger) 表示大于 j 的数。
- i × Prime[s] 的最小质因数确实是 Prime[s]。
- i × Prime[L]的最小质因数一定是 Prime[j]而不是Prime[L]。
这说明,如果 j继续递增(将用 Prime[L]去筛 i × Prime[L] ,而此时i × Prime[L]的最小质因数并不是Prime[L]而是Prime[j])故该跳出;