素数筛选法 (求1~n的素数)

1、下面是求1~n的素数的一般方法:

//求1~n的素数一般方法
#include<iostream>
using namespace std;
int main()
{
   int n,i,j,k=1;
   bool bo;
   cin>>n;cout<<"2 ";
     for (i=3;i<=n;i+=2)
	{
	   bo=true;
           for (j=3;j*j<=i;j+=2)
            if (i%j==0)
	     {
	       bo=false;
	       break;
	     }
	       if (bo)
		 {
	           if (k%10==0) cout<<endl;
		    cout<<i<<' ';
		      k++;
	         }
	}
      cout<<endl<<k<<endl;
  return 0;
}

2、对于素数筛选法,具体方法就不阐述了,百度一下就能找到,简单地说就是找到一个素数就把它的倍数标记为非素数。

参考代码:

//素数筛选法求1~n的素数
#include<iostream>
using namespace std;
#define N 1000000000
  bool isprime[N];
  int prime[100000];
int main()
{
	int n,i,j,k=1;
	memset(isprime,true,sizeof(isprime));
	   cin>>n;
	     int num=0;
		   prime[num++]=2;
     	        for (i=3;i<=n;i+=2)
		   {
		      if (isprime[i])
			   {
			      prime[num++]=i;
				for (j=i+i;j<=n;j+=i)  
				   isprime[j]=false;
			   }
		   }
		   for (i=0;i<num;i++)
		   {
	             cout<<prime[i]<<' ';
		       if ((i+1)%10==0)
         		  cout<<endl;
		   }
      cout<<endl<<num<<endl;
  return 0;
}

3、下面是我对算法的小小的优化:

 

         就是将   for ( j=i+i ; j<=n ; j+=i )   改成    for ( j=i*i ; j<=n ; j+=2*i )   因为2*i是2的倍数,3*i是3的倍数,5*i是5的倍数~~~~~~,所以 j 直接从 i*i 开始;而每次j 自加2*i ,

这样可以把偶数给排除掉。修改后可以减少一部分的重复赋值。

完整代码:

#include<iostream>
using namespace std;
#define N 1000000000
  bool isprime[N];
  int prime[100000];
int main()
{
	int n,i,j,k=1;
	memset(isprime,true,sizeof(isprime));
	   cin>>n;
	     int num=0;
	       prime[num++]=2;
     	   for (i=3;i<=n;i+=2)
	     {
	       if (isprime[i])
	         {
		    prime[num++]=i;
		      for (j=i*i;j<=n;j+=2*i)
			 isprime[j]=false;
	         }
	     }
	  for (i=0;i<num;i++)
	    {
	      cout<<prime[i]<<' ';
	         if ((i+1)%10==0)
	           cout<<endl;
	    }
      cout<<endl<<num<<endl;
  return 0;
}


  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值