线性筛法找质数 —O(n)
int main()
{
long MAXP;
cout << "输入范围MAXP [1~MAXP]:" << endl;
cin >> MAXP;
int *prime = new int[MAXP] ,num_prime(0);
int *isNotPrime = new int[MAXP];
isNotPrime[0]=1;isNotPrime[1]=1;
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;
}
算法描述:
输入:MAXP
输出:[0 MAXP]区间中所有的质数。
初始状态:0,1不是质数,标记isNotPrime [0]=1, isNotPrime[1]=1。 先假设除了0,1以外的数i均为质数,标记isNotPrime[i]=0。
算法对每一个数i
1):如果i是素数,则将i加入到prime数组中,筛除每一个数prime[j]*i(i*prime[j] < MAXP)。
2) : 如果i是合数,则 i=px11∗px22∗px33∗px44∗…∗pxnn=(x1,x2,