python - 查找最近的素数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)
正确的输出应该是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
它的作用大致相同,但它使用一种称为“埃拉托色尼筛法”的算法来加快寻找素数的速度(与您使用的“试除法”相反)。它不是世界上最快的 Sieve,但无需太多调整即可合理理解。
在任何一种情况下,如果您多次调用它,您可能想要跟踪您找到的所有素数,因为计算它们的成本很高。Python 中的缓存既简单又灵活,如果您确实需要提高速度,有很多方法可以实现这一点。
请注意,我不肯定您指定的范围始终包含素数。很有可能,如果是这样,您可以使用更短的代码。类似于以下内容。
def get_nearest_prime(old_number):
return np.max(seive(2*old_number-1))
我不完全同意您选择的名称,因为该区间中最大的素数通常不是最接近 的素数old_number
,但我认为无论如何这就是您要寻找的。
推荐阅读
- reactjs - 如何解决 SyntaxError: Can't use import implementation Magic with NextJS in a Typescript setup?
- reactjs - 对嵌套数据反应 groupby
- ios - 编辑时缩进 UITableView 部分标题
- react-native - React Native 比较平面列表中项目之间的值
- r - 迭代R中的2个列表
- javascript - 将反应路由器嵌套在另一个组件中,同时保留侧边栏
- react-native - 图标显示错误的 react-native-vector-icon (icomoon)
- excel - 检查单元格值和单元格格式时的 VBA 类型不匹配
- java - Android NowPlaying MediaSession 锁屏(三星)
- debian - 交叉编译 QT6,configure 无法识别目标上已安装的包/库