素数判断与素数筛选法

本文介绍了素数筛选的三种方法,包括直接判断、Eratosthenes筛法及其进阶优化。优化思路在于避免重复筛选,仅使用最小质数进行倍数排除,提高效率。

素数筛选法

方法一:直接判断,思想简单,实现比较简单,但是复杂度过高
bool isprime(int a)
{
   
   
    for(int i = 2;i * i <= a;i++)
    {
   
   
        if(a % i ==0)   return false;
    }
    return true;
}
方法二:素数筛选法(Eratosthenes 筛法)
  1. 只有素数才能当筛子
  2. 筛掉对应的倍数,不超过要求的范围即可
  3. 遍历一遍代码
void getPrime(int n)
{
   
   
    memset(prime,true,sizeof(prime));
    prime[0] = prime[1
判断素数筛选法有多种,以下是几种常见的素数选方法: - **平方根枚举**:这是最常用的素数选方法。其核心思想是对于一个数 \(n\),只需要检查从 \(2\) 到 \(\sqrt{n}\) 是否有因数,若都没有,则 \(n\) 为素数。该方法适用于单个素数判断,时间复杂度为 \(O(\sqrt{n})\)。在 Python 中可以用如下代码实现: ```python import math def is_prime(n): if n < 2: return False for i in range(2, int(math.sqrt(n)) + 1): if n % i == 0: return False return True ``` 这种方法通过减少不必要的检查范围,提高了判断效率 [^2]。 - **埃氏**:理解起来相对容易,是一种较为常用的素数选方法。其基本思路是从 \(2\) 开始,将每个素数的倍数标记为合数。首先假设所有数都是素数,然后从 \(2\) 开始,把 \(2\) 的倍数标记为合数,接着找到下一个未被标记的数(即素数),再将其倍数标记为合数,以此类推。该方法的复杂度大概是 \(O(n \log(\log n))\)。虽然复杂度看起来比较和谐,但调用函数次数相对较多 [^1][^4]。 - **线性(欧拉)**:逻辑性较强,适用于对数据和时间复杂度要求严格的情况。它在埃氏的基础上进行了优化,保证每个合数只会被其最小的质因数去,从而达到了线性的时间复杂度 \(O(n)\)。当遇到一些对数据、时间复杂度要求严格的题目时,埃氏可能无法满足要求,此时线性就可以发挥作用 [^1][^3]。 - **朴素筛选法**:思路简单,先写一个判断是否是素数的函数 `isPrime()`,然后从 \(2\) 到 \(n\) 分别调用该函数来检查。检查是否是质数时,使用从 \(2\) 到 \(n\) 的开根的数作为除数。这是因为如果当前选到 \(p\),则说明 \(1\times p,2\times p,\cdots,(p - 1)\times p\) 已经在选 \(1,2,3,\cdots,p - 1\) 的时候被处理过了,现在只需要接着处理 \(p\times p\) 即可,即要求 \(p\times p \leq n\)。该方法复杂度大概是 \(O(n\times\log(n))\),不过调用函数次数过多 [^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值