如果是判断一个数是否为素数,请参考我的博文:http://blog.csdn.net/aleichen/article/details/50762187
下面是用欧拉函数线性复杂度筛选素数:
(1)返回[1..n]区间素数的个数
const int MAXN=3000001;
int prime[MAXN];//保存素数
bool vis[MAXN];//初始化
int Prime(int n)
{
int cnt=0;
memset(vis,0,sizeof(vis));
for(int i=2;i<n;i++)
{
if(!vis[i])
prime[cnt++]=i;
for(int j=0;j<cnt&&i*prime[j]<n;j++)
{
vis[i*prime[j]]=1;
if(i%prime[j]==0)//关键
break;
}
}
return cnt;//返回小于等于n的素数的个数
}
(2)打印[0..n]中的所有素数,并返回数量
<pre name="code" class="cpp">long FilterPrime(int n)
{
long count=0;
bool* isPrimes = new bool[n+1];
for(int i=2;i<=n;++i)isPrimes[i] = true;
isPrimes[2] = true;
for(int j=2;j<=n;++j){
if(isPrimes[j]==true)
for(int m=2;j*m<=n;++m)isPrimes[j*m] = false;
}
for(int k=2;k<=n;++k)
{
if(isPrimes[k]==true){
cout<<k<<",";<span style="white-space:pre"> </span>//打印素数
count++;
}
}
delete [] isPrimes;
return count;
}