[英]Find nearest prime number python
我想找到range(old_number + 1, 2*old_number)
的最大素数
到目前为止,这是我的代码:
def get_nearest_prime(self, old_number):
for num in range(old_number + 1, 2 * old_number) :
for i in range(2,num):
if num % i == 0:
break
return num
当我调用get_nearest_prime(13)
时,正确的 output 应该是23
,而我的结果是25
。 谁能帮我解决这个问题? 帮助将不胜感激!
您可以进行很多更改,但是您应该进行哪些更改取决于您想要完成的任务。 您的代码目前最大的问题是您成功地通过break
识别素数,然后不对该信息执行任何操作。 这是做大致相同事情的最小更改。
def get_nearest_prime(old_number):
largest_prime = 0
for num in range(old_number + 1, 2 * old_number) :
for i in range(2,num):
if num % i == 0:
break
else:
largest_prime = num
return largest_prime
我们正在使用largest_prime
局部变量来跟踪您找到的所有素数(因为您以递增顺序遍历它们)。 else
子句会在您“正常”退出内部for
循环(即没有命中break
子句)时触发。 换句话说,任何时候你找到一个素数。
这是一个稍微快一点的解决方案。
import numpy as np
def seive(n):
mask = np.ones(n+1)
mask[:2] = 0
for i in range(2, int(n**.5)+1):
if not mask[i]:
continue
mask[i*i::i] = 0
return np.argwhere(mask)
def get_nearest_prime(old_number):
try:
n = np.max(seive(2*old_number-1))
if n < old_number+1:
return None
return n
except ValueError:
return None
它做的事情大致相同,但它使用一种称为“Eratosthenes 筛法”的算法来加速素数的查找(与您正在使用的“试验除法”相反)。 它不是世界上最快的筛子,但无需太多调整就可以合理理解。
在任何一种情况下,如果您多次调用它,您可能希望跟踪您发现的所有素数,因为计算它们的成本很高。 缓存在 Python 中既简单又灵活,如果您确实需要速度提升,有许多方法可以实现这一点。
请注意,我不确定您指定的范围始终包含质数。 很有可能,如果确实如此,您可以使用更短的代码。 像下面这样的东西。
def get_nearest_prime(old_number):
return np.max(seive(2*old_number-1))
我不完全同意您选择的名称,因为该区间中最大的素数通常不是最接近old_number
的素数,但我认为这正是您要寻找的。
您可以使用子列表检查数字是否为质数,如果all(i % n for n in range(2, i))
表示该数字是prime
,因为从模返回的所有值都是True
而不是 0。从那里你可以将这些值append
到一个名为primes
的列表,然后取该列表的max
。
列表理解:
num = 13
l = [*range(num, (2*num)+1)]
print(max([i for i in l if all([i % n for n in range(2,i)])]))
展开:
num = 13
l = [*range(num, (2*num)+1)]
primes = []
for i in l:
if all([i % n for n in range(2, i)]):
primes.append(i)
print(max(primes))
23
使用seive function 从上面搜索最近的素数
def get_nearest_prime(old_number):
return old_number+min(seive(2*old_number-1)-old_number, key=lambda a:a<0)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.