埃式筛法C++实现

埃式筛法

引入

背景

‌埃式筛法,也称为‌埃拉托斯特尼筛法(Sieve of Eratosthenes),是一种由希腊数学家埃拉托斯特尼提出的简单算法,用于检定‌素数。这种方法通过逐步剔除不大于根号n的所有素数的倍数,从而找出自然数n以内的全部素数。‌

题目

给定正整数n,请求出1 , 2 , …  , n 间所有质数

输入格式

一个正整数n

输出格式

一行多个整数,表示1 , 2 , …  , n 间所有质数,每个质数用空格隔开。

样例输入 1

10

样例输出 1

2 3 5 7

算式

要得到自然数n以内的全部素数,必须把不大于在这里插入图片描述
的所有素数的倍数剔除,剩下的就是素数。

给出要筛数值的范围n,找出以内的素数。先用2去筛,即把2留下,把2的倍数剔除掉;再用下一个质数,也就是3筛,把3留下,把3的倍数剔除掉;接下去用下一个质数5筛,把5留下,把5的倍数剔除掉;不断重复下去…。

步骤

  1. 初始化‌:首先,列出从2开始的所有自然数序列。
  2. 筛选过程‌:
    • 用2去除序列中的所有倍数,留下非2的倍数。
    • 接着用下一个质数3去除剩余数字中的3的倍数,留下非3的倍数。
    • 重复此过程,每次选择未被剔除的下一个质数,去除该质数的倍数,直到序列中的下一个质数大于当前序列中最大数的平方根为止。
  3. 结束条件‌:如果剩余序列中的最大数小于当前筛选质数的平方,则剩余的数字均为素数。

例如,假设我们要找出小于或等于10的所有素数:

  • 第一步,列出2到25的数字:2, 3, 4, 5, 6, 7, 8, 9, 10。
  • 第二步,用2去除所有2的倍数(留下2),用3去除所有3的倍数(留下3),用5去除所有5的倍数(留下5),用7去除所有7的倍数(留下7)。
  • 第三步,继续这个过程,直到找到所有的素数:2, 3, 5,7。

实现代码

#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 1;
int n;
bool flag[N] = {1, 1};
void Eratothenes() {
	for (int i = 2; i * i <= n; ++i)
		if (!flag[i])
			for (int j = 2; i * j <= n; ++j) flag[i * j] = 1;
}
int main() {
	scanf("%d", &n);
	Eratothenes();
	for (int i = 2; i <= n; ++i)
		if (!flag[i]) printf("%d ", i);
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值