优化寻找下一个素数的代码



我是Python和StackOverflow的新手,所以如果这个问题重复得太多,或者如果它不是一个好问题,我很抱歉。我正在上初学者的Python课程,我要做的任务之一是创建一个函数,在给定输入后找到下一个素数。这是我目前所看到的:

def nextPrime(n):
num = n + 1
for i in range(1, 500):
for j in range(2, num):
if num%j == 0:
num = num + 1
return num 

当我在网站的IDE上运行它时,它很好,一切都很好,但是当我提交任务时,它说运行时间太长,我应该优化我的代码。但我真的不知道如何做到这一点,所以是否有可能得到一些反馈或任何建议,如何使它运行得更快?

当您的函数找到答案时,它将继续检查相同的数字数百次。这就是为什么要花这么长时间。另外,当您增加num时,您应该跳出嵌套循环,以便首先根据小因子检查新数字(这更有可能消除它并加速进度)。

为了使它更简单和有效,你应该把你的问题分解成关心的领域。检查一个数字是否是素数应该在它自己的单独函数中实现。这将使nextPrime()函数的代码更加简单:

def nextPrime(n):
n += 1 
while not isPrime(n): n += 1
return n

现在你只需要实现一个有效的isPrime()函数:

def isPrime(x):
p,inc = 2,1
while p*p <= x:
if x % p == 0: return False
p,inc = p+inc,2
return x > 1

从1循环到500,特别是当另一个循环穿过它时,不仅效率低下,而且还限制了可能的"下一个素数"的范围。你要找的东西。因此,您应该利用while循环和break,当您找到素数时,它们可用于跳出循环(当然,如果提示符中声明该数字小于501,则您的方法完全有意义)。

此外,您可以利用这样一个事实,即您只需要检查小于或等于指定整数的平方根的整数(在python中表示为num**0.5)来确定该整数是否为素数,因为整数的除数总是成对的,并且如果存在的话,较小的除数中的最大除数总是平方根。

最新更新