欧拉筛法与埃氏拉筛

如果我们想知道从零到一个数有哪些质数 ,我们首先会想到运用枚举法 ,将小于这个数的每个数都相乘一遍,这样的做法会大大降低 我们程序的质数增加时间 ,事实上,在我们之前就有许多人尝试运用另外的思维,当然,他们成功了,这就徒手搓出我们现在所使用的几种筛法,而我们现在要讲的正式四种筛法 中的中间两种,欧拉筛埃氏筛

欧拉筛法

步骤:

1.2到某数N之间的自然数列出来,标准格式为:2,3,4,...,N【1】

2.设为第一个素数

3.2的倍数全部剔除

4.到下一个未被剔除的数,将其设为第二个素数;

5.该数的倍数全部剔除

6.复第4、5步,直到所有小于某数的素数都被找出来

【1】:为什么第一个数是2而不是0?//寻找质数从2开始1和0既不是质数也不是合数

图表:

代码实现:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
	int a[100005]={0},pri[10005];
	int i,j,num;
	num=0;
	for(i=2;i<=100000;i++)
	{
		if(a[i]==0)
		{
			pri[++num]=i;
		}
		for(j=1;j<=num;j++)
		{
			if(i*pri[j]>100000)
			{
				break;
			}
			a[i*pri[j]]=1;
			if(i%pri[j]==0)
			{
				break;
			}
		}
	}
	for(i=1;i<=num;i++)
	{
		cout<<pri[i]<<endl;
	}
	return 0;
}

=========================================================================

埃氏筛法:

步骤:

  1. 2到某数N之间的自然数列出来,标准格式为:2,3,4,...,N

  2. 设第一个数是素数

  3. 枚举所有p的倍数(2p,3p,4p,...),标记为非质数(合数);

  4. 找到下一个 没有标记 且 大于p 的数。如果没有,结束运算;如果有,将该值赋予p,重复步骤4;

  5. 运算结束后,剩下所有未标记的数都是找到的质数。

//我觉得这两个方法大致相同

图表:

图像来源于;(14条消息) 埃拉托色尼筛选法巧解质数问题(埃氏筛法求解素数问题)_质数筛选法动图_吴雨4的博客-CSDN博客

代码实现:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
	int a[100005]={0};
	int i,j;
	for(i=2;i<=100000/i;i++)
	{
		if(a[i]==0)
		{
			for(j=2;i*j<=100000;j++)
			{
				a[i*j]=1;
			}
		}
	}
	for(i=2;i<=100000;i++)
	{
		if(a[i]==0)
		{
			cout<<i<<endl;
		}
	}
	return 0;
}
相关推荐
zh路西法2 分钟前
【玩转VLA具身智能机械臂】(二):MoveIt2 运动规划——架构、配置与 C++ 上手
c++·机械臂·路径规划·vla·planner·moveit2
SomeB1oody12 分钟前
【RustyML入门】7.2. 深入模型持久化
开发语言·后端·机器学习·rust·教程
yaoxin52112314 分钟前
502. Java 反射 - 编写 MessageInterceptor 类
java·开发语言
五月底_14 分钟前
LIS算法
python·算法·最长子序列
wuyk55517 分钟前
Python零基础入门第五章:元组Tuple(不可变容器详解、列表与元组区别)
开发语言·python
2601_9657984724 分钟前
Build a Fast, High-Ranking Restaurant Website with Rolanda Theme
开发语言·ios·swift
caimouse28 分钟前
ReactOS 窗口系统分析(25):标题栏显示与系统按钮 — nonclient.c 标题栏专题
c语言·开发语言
诺伦34 分钟前
Rust 错误处理实战:从 unwrap 到优雅 Result 的进阶之路
开发语言·后端·rust
学学酱快乐39 分钟前
2026年PMP考试生命周期选择决策树精讲:从需求判断到混合型统一框架的应试全攻略
算法·决策树·机器学习·pmp新版考试大纲·pmp新题型·pmp培训哪家好·pmp培训机构推荐
爱和冰阔落1 小时前
【Linux】Ctrl+C 到底做了什么?从键盘、kill 到 alarm,一次讲清信号的产生
linux·运维·c++·安卓