[英]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.