质数——朴素筛

朴素筛


一、朴素筛是什么?

筛除一个序列中非的质数的数

二、应用

1.原题

在这里插入图片描述

2.题解实现

代码如下(示例):
在这里插入图片描述

#include<iostream>
#include<algorithm>

using namespace std;

const int N = 1e6 + 10;

int primes[N], cnt;
bool st[N];

void get_prime(int n)
{
	for(int i = 2; i <= n; i++)
	{
		if(!st[i])
		{
			primes[cnt++] = n;
			for(int j = i + i;j <= n; j += i)	st[j] = true;
		}
	}
} 

该处使用的url网络请求的数据。


总结

质数——朴素筛

### 埃拉托色尼筛法中的开根号优化 埃拉托色尼筛法的核心在于通过剔除小于等于某个范围内的所有素数的倍数来找到所有的素数。为了提高效率,通常会引入一种基于平方根的操作来进行优化。 #### 传统方法与问题 如果按照朴素的方法去判断一个自然数 \( n \) 是否为素数,则需要尝试将其分别除以从 2 到 \( n-1 \) 的每一个整数。这种方法的时间复杂度较高,达到 \( O(n) \)[^1]。 然而,实际上我们并不需要测试到 \( n-1 \),只需要测试到 \( \sqrt{n} \) 即可。这是因为任何大于 \( \sqrt{n} \) 的因子必然对应一个小于 \( \sqrt{n} \) 的因子。换句话说,如果 \( n \) 不是一个完全平方数,那么它的最大因数不会超过 \( \sqrt{n} \)[^3]。 #### 开根号优化的具体实现 在实际应用中,可以通过如下方式进一步减少不必要的计算: 1. **仅考虑不超过 \( \sqrt{n} \)** 对于给定的一个上限值 \( n \),只需关注那些不大于 \( \sqrt{n} \) 的潜在素数即可。这些较小的素数一旦被确认,就可以用来标记它们的所有倍数作为合数。 2. **逐步扩展筛选范围** 首先初始化一个布尔数组 `is_prime` 来记录每个数字的状态,默认设为真(即假设都是素数)。接着遍历该范围内可能成为候选者的数值,并利用其倍数关系更新状态表。 以下是采用 Python 实现的一个例子: ```python import math def sieve_of_eratosthenes(limit): is_prime = [True] * (limit + 1) p = 2 while (p * p <= limit): # 只需处理至 sqrt(limit) if (is_prime[p]): for i in range(p * p, limit + 1, p): is_prime[i] = False p += 1 primes = [] for num in range(2, limit + 1): if is_prime[num]: primes.append(num) return primes print(sieve_of_eratosthenes(50)) ``` 上述代码片段展示了如何有效地运用开方后的界限条件来加速整个过程。注意循环终止条件设置成了 `while (p * p <= limit)` ,这正是得益于前面提到的理论支持——无需超出这个边界再做额外检验。 #### 进一步改进方向 尽管如此,还有其他更高效的算法可供选择,比如线性时间复杂度的欧拉筛法(Sieve of Euler),它能够避免重复删除某些已经被标记过的复合数的情况发生,从而获得更好的性能表现[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜狗原来是我自己

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值