您的位置:首页 > 其它

高效的求取100以内的质数

2015-05-11 15:29 274 查看
求取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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: