素数打表,埃式筛法

我们在求解问题的时候会经常碰到素数(问题),以下对素数求解问题比较
素数:素数是指在大于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;
 }
发布了14 篇原创文章 · 获赞 0 · 访问量 217

猜你喜欢

转载自blog.csdn.net/qq_43566782/article/details/104054357
今日推荐