leetcode:输入m,n(1 < m < n < 1000000),返回区间[m,n]内的所有素数的个数

题目:

输入m,n(1 < m < n < 1000000),返回区间m,n内的所有素数的个数。

题解:

要计算区间 m,n 内的所有素数的个数,我们可以使用一种高效的素数判定方法,如"埃拉托斯特尼筛法"(Sieve of Eratosthenes)。然而,由于 m 和 n 的范围可能非常大(最大到 1000000),直接对 1,n 使用埃拉托斯特尼筛法可能不够高效。因此,我们可以对 m,n 进行一个局部筛选。

埃拉托斯特尼筛法:基本原理

埃拉托斯特尼筛法的基本思想是通过标记合数来筛选素数。一个合数,必然可以表示成一个自然数i和一个素数的乘积。因此,找到一个素数后,可以将其小于n的倍数全部标记为合数。最终,未被标记的数即为素数。

具体来说,要得到自然数n以内的全部素数,必须把不大于√n的所有素数的倍数剔除。这是因为一个合数一定可以分解为两个因数的乘积,其中至少有一个因数不大于其平方根。

埃拉托斯特尼筛法:算法步骤

  1. 初始化一个布尔数组is_prime,标记所有大于等于2且小于等于n的数为素数(即is_primei初始化为True)。
  2. 从2开始,找到下一个未被标记为非素数的数p,将其标记为素数(即确认is_primep为True)。
  3. 将该素数的倍数(除了该素数本身)标记为非素数(即将is_primep的倍数设置为False)。
  4. 重复步骤2和步骤3,直到找不到更大的素数。
  5. 最终,未被标记为非素数的数即为素数。
python 复制代码
def count_primes_in_range(m, n):
    if m < 2:
        m = 2
    sqrt_n = int(n ** 0.5) + 1
    is_prime = [True] * (sqrt_n + 1)
    p = 2
    while (p * p <= sqrt_n):
        if is_prime[p]:
            for i in range(p * p, sqrt_n + 1, p):
                is_prime[i] = False
        p += 1
    is_prime_in_range = [True] * (n - m + 1)
    for p in range(2, sqrt_n + 1):
        if is_prime[p]:
            start = max(p * p, (m + p - 1) // p * p)
            for j in range(start, n + 1, p):
                if j >= m:
                    is_prime_in_range[j - m] = False
    prime_count = sum(is_prime_in_range)
    return prime_count


if __name__ == '__main__':
    m = int(input("输入m(请确保1 < m < n < 1000000): "))
    n = int(input("输入n(请确保1 < m < n < 1000000): "))
    prime_count = count_primes_in_range(m, n)
    print(prime_count)
相关推荐
冻柠檬飞冰走茶24 分钟前
PTA刷题集之Airline Routes(C语言实现)
c语言·开发语言·数据结构·算法
宗旨飞翔27 分钟前
不同的二叉搜索树
算法
736c38 分钟前
固件开发岗算法
数据结构·算法
青少儿编程课堂1 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:倍增法求最近公共祖先LCA解析
c++·python·算法·bfs·信息学竞赛
冻柠檬飞冰走茶1 小时前
PTA刷题集之Battle Over Cities - Hard Version(C语言实现)
c语言·开发语言·数据结构·算法
吴长建先生重名了1 小时前
电商订单系统在Docker和Kubernetes中部署的高
算法
東隅已逝,桑榆非晚3 小时前
算法2. 双指针法-复写零
c++·笔记·学习·算法
云析赢指标公式网44 小时前
文华财经指标源码笔记:WINNER筹码函数、控盘变量与MACD变体的调试记录
java·笔记·算法
CC数分5 小时前
统计学基础|先把问题问对:数据分析的六大类型
大数据·人工智能·算法
文丑颜不良啊6 小时前
LeetCode1721~1740题目解析
java·leetcode