素数打表,埃式筛法

我们在求解问题的时候会经常碰到素数(问题),以下对素数求解问题比较
素数:素数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
1:根据定义我们能够写出以下代码判断素数
思路:枚举2到n-1判断他们能否被整除,不能即是素数

int prime(int n)
{
    for(int i=2;i<n;i++)
    if(n%i==0)return 0;
    return 1;
}

题目描述:求出1-N中的所有素数
输入
大于1的正整数N
输出
1-N中的所有素数,(以从小到大的格式输出)
样例输入9
样例输出2 3 5 7

#include<iostream>
using namespace std;
int prime(int n)
  {
	for(int i=2;i<n;i++)
 	if(n%i==0)return 0;
 	return 1;
  }
int main()
{
    int n;
    cin>>n;
    for(int i=2;i<=n;i++)
   { 
     if(prime(i))
     cout<<i<<" ";
   }
   return 0;
 } 

2:对1进行优化
思路:枚举2到sqrt(n)能否被整除,不能即是素数。

int prime(int n)
{
     for(int i=2;i*i<=n;i++)
     if(n%i==0)return 0;
     return 1;
}

3:对2的优化
我们有时候在会遇到求前1000000个素数,如果继续枚举,在时间有限的情况下会超时的,那么如何更有效地节约时间,就需要提前预处理以下,对素数打表。
埃式筛法:
思路:首先枚举2,筛选2的倍数4,6,8…都被筛选走了,接下来枚举3,3的倍数6,9,12…也被筛选走了,最终留下来的都是素数

    memset(vis,0,sizeof(vis));
    for(int i=2;i<=n;i++)
    for(int j=2*i;j<=n;j+=i)
    vis[j]=1;

这样我们就得到了前n个素数。
4:对3的优化

 memset(vis,0,sizeof(vis));
 for(int i=2;i*i<=n;i++)
 {
  if(!vis)
  for(int j=i*i;j<=n;j+=i)
  vis[j]=1;
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值