欧拉筛(线性筛)

实现:

#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 的数。

  1. i × Prime[s] 的最小质因数确实是 Prime[s]。
  2. i × Prime[L]的最小质因数一定是 Prime[j]而不是Prime[L]。
    这说明,如果 j继续递增(将用 Prime[L]去筛 i × Prime[L] ,而此时i × Prime[L]的最小质因数并不是Prime[L]而是Prime[j])故该跳出;

猜你喜欢

转载自blog.csdn.net/wenyisir/article/details/106358446
今日推荐