网站推广技术哪家好,专业网站开发建设,福州高端网站定制,网站建设家居题目#xff1a; 输入m,n(1 m n 1000000)#xff0c;返回区间[m,n]内的所有素数的个数。
题解#xff1a; 要计算区间 [m,n] 内的所有素数的个数#xff0c;我们可以使用一种高效的素数判定方法#xff0c;如“埃拉托斯特尼筛法”#xff08;Sieve of E…
题目 输入m,n(1 m n 1000000)返回区间[m,n]内的所有素数的个数。
题解 要计算区间 [m,n] 内的所有素数的个数我们可以使用一种高效的素数判定方法如“埃拉托斯特尼筛法”Sieve of Eratosthenes。然而由于 m 和 n 的范围可能非常大最大到 1000000直接对 [1,n] 使用埃拉托斯特尼筛法可能不够高效。因此我们可以对 [m,n] 进行一个局部筛选。
埃拉托斯特尼筛法基本原理 埃拉托斯特尼筛法的基本思想是通过标记合数来筛选素数。一个合数必然可以表示成一个自然数i和一个素数的乘积。因此找到一个素数后可以将其小于n的倍数全部标记为合数。最终未被标记的数即为素数。 具体来说要得到自然数n以内的全部素数必须把不大于√n的所有素数的倍数剔除。这是因为一个合数一定可以分解为两个因数的乘积其中至少有一个因数不大于其平方根。
埃拉托斯特尼筛法算法步骤
初始化一个布尔数组is_prime标记所有大于等于2且小于等于n的数为素数即is_prime[i]初始化为True。从2开始找到下一个未被标记为非素数的数p将其标记为素数即确认is_prime[p]为True。将该素数的倍数除了该素数本身标记为非素数即将is_prime[p的倍数]设置为False。重复步骤2和步骤3直到找不到更大的素数。最终未被标记为非素数的数即为素数。
def count_primes_in_range(m, n):if m 2:m 2sqrt_n int(n ** 0.5) 1is_prime [True] * (sqrt_n 1)p 2while (p * p sqrt_n):if is_prime[p]:for i in range(p * p, sqrt_n 1, p):is_prime[i] Falsep 1is_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] Falseprime_count sum(is_prime_in_range)return prime_countif __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)