高效的求取100以内的质数

    求取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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值