📅  最后修改于: 2023-12-03 15:39:56.020000             🧑  作者: Mango
UGC NET CS 2018 年 7 月 – II 考试中的问题 41 主要涉及到数学和编程两个方面,考查了程序员的数学知识和编程理解能力。这道问题的具体是如何在给定的区间内计算素数的个数,需要编写程序,并给出时间复杂度。
给定两个正整数 p 和 q,计算出 [p, q] 区间内的素数的个数。
本题主要考查基础算法和数学知识。首先判断一个数是不是素数的方法,可以使用暴力枚举法。即对于每一个要判断的数,从 2 开始到其自身减 1 逐个检查是否存在因子,若存在则不是素数,否则是素数。
在这个基础上,可以使用一个外层循环枚举区间 [p, q] 中的每一个数,内层循环判断是否是素数,最后统计素数的个数即可。
这种暴力枚举法时间复杂度较高,为 O((q-p+1)*sqrt(q))。优化方法可以采用埃拉托斯特尼筛法,可以将程序的时间复杂度优化到 O(sqrt(q)),具体实现可以参考其他优秀算法题库。
在设计代码的时候,需要注意边界问题,特别是当 p 或 q 非常大的时候,可能会出现超时或者其他问题。
def is_prime(num):
if num<=1: return False
for i in range(2, int(num**0.5)+1):
if num%i==0:
return False
return True
def count_primes(p, q):
count = 0
for i in range(p, q+1):
if is_prime(i):
count += 1
return count
这个示例代码使用了简单的暴力枚举方法来计算 p
到 q
区间内的素数个数,时间复杂度为 O((q-p+1)*sqrt(q))。需要注意,这个算法在处理比较大的数时,可能会内存或者时间超限,需要进行适当的优化。
def count_primes(p, q):
primes = []
is_prime = [True] * (q+1)
is_prime[0], is_prime[1] = False, False
for i in range(2, q+1):
if is_prime[i]:
primes.append(i)
for j in range(i*i, q+1, i):
is_prime[j] = False
count = sum(1 for prime in primes if prime>=p)
return count
这个示例代码使用了埃拉托斯特尼筛法来计算 p
到 q
区间内的素数个数,时间复杂度为 O(sqrt(q)),在大数据集合条件下可以达到比较理想的效果。