求取100以内的质数,常见的做法就是双重循环,内层循环的终值为外层循环值的二次方根值,若两数一直不能够整除,则为质数。但两层循环在数据量较大时,效率极低。现提供另外一种思路:
<span style="font-size:18px;">#include<iostream>
#include<math.h>
using namespace std;
int main()
{
//质数只可能从奇数总产生,故若判断100以内的质数,只需用50的布尔数组来存储各个奇数的判断结果
bool IsNotPrime[50]={0}; //存储质数的判断结果,IsNotPrime[i]=false,则i*2+1为质数
IsNotPrime[0]=true;
double sqrtnum=(sqrt(100)-1)/2; //100以内的非质数,其因数必有一个小于根号100的,再转换成其数组编号
int a;
int primecount=0;
cout<<2<<"\t"<<' ';
primecount++;
for(a=1;a<=(int)sqrtnum;++a)
{
bool flag=IsNotPrime[a];
if(!flag)
{
int prime=a*2+1;
cout<<prime<<"\t"<<' ';
primecount++;
int i=3;
int notprime=prime*i;
while(notprime<=100)
{
IsNotPrime[(notprime-1)/2]=true;
i=i+2;
notprime=prime*i;
}
}
}
for(int a=(int)(sqrtnum+1);a<50;++a)
{
bool tempflag=IsNotPrime[a];
if(!tempflag)
{
primecount++;
int prime=a*2+1;
cout<<prime<<"\t"<<' ';
}
}
cout<<"primecount "<<primecount<<endl;
return 0;
} </span>
参考:
http://news.csdn.net/article.html?arcid=15823934&preview=1