C++中两种质数筛法

第一种:Eratosthenes筛法O(N log log N)

这种筛法核心就是枚举从2~N之间的数,把他们的倍数都设为不是质数,如果筛到一个不是质数直接跳过即可,又由于小于x^2的x的倍数都被比x更小的数已经标记过了,所以可以直接从x ^ 2开始

inline void primes(int n) {
	for(re i=2;i<=n;i++) {
		if(v[i]) continue;
		for(re j=i;j<=n/i;j++) v[i*j]=1;
	}
}

判断一个数是否是质数,如果为0即为质数,注意特判1不是质数

第二种:线性筛法O(N)

inline void primes(int n) {
	memset(v,0,sizeof(v)); m=0;
	for(re i=2;i<=n;i++) {
		if(!v[i]) { v[i]=i; prime[++m]=i; }
		for(re j=1;j<=m;j++) {
			if(prime[j]>v[i]||prime[j]>n/i) break;
			v[i*prime[j]]=prime[j];
		}
	}
}

你可能感兴趣的:(数论,质数,数论,筛法,C++)