线性筛法求素数(C/C++版)

#include using namespace std; const long MAXP = 200000; long prime[MAXP] = {0},num_prime = 0; int isNotPrime[MAXP] = {1, 1}; int main() { for(long i = 2 ; i < MAXP ; i ++) { if(! isNotPrime[i]) prime[num_prime ++]=i; for(long j = 0 ; j < num_prime && i * prime[j] < MAXP ; j ++) { isNotPrime[i * prime[j]] = 1; if( !(i % prime[j])) break; } } return 0; }

#include #define maxn 9001 //#define maxn 9000001 int prim[maxn]; char isNotPrim[maxn] = {1, 1}; int num=0, i, j; //__int64 sum; void main() { for(i=2; i

线性筛法,即是筛选掉所有合数,留下质数

我们知道合数可以由一个质数数与另一个数相乘得到

而同时假设合数a=质数b*质数c*一个数d

令e=c*d,假设b≥e,e为合数,   令f=d*b,f也为合数

所以e<=f,b>=c

a=b*(c*d)=b*e;

a=(b*d)*c=f*c;

即比一个合数数大的质数和该合数的乘积可用一个更大的合数和比其小的质数相乘得到

这也是if(!( i % prime[j]))break;的含义,这也是线性筛法算质数表的关键所在

你可能感兴趣的:(线性筛法求素数(C/C++版))