我为您的算法find_primes() 提供了最少的修正以使其正常工作,您遇到的唯一问题是错误的缩进(行首的空格数错误)。
我实现了一个更快的版本find_primes2(),它检查直到数字的平方根并且只检查赔率。
然后是更快的版本find_primes3(),它检查直到平方根并且只检查当前素数列表中的除数。
Try it online!
def find_primes(nums):
lst = []
for pr in range(2, nums + 1):
prime = True
for num in range(2, pr):
if pr % num == 0:
prime = False
break
if prime:
lst.append(pr)
return(lst)
print(find_primes(123))
def find_primes2(nums):
import math
if nums < 2:
return []
lst = []
for pr in range(3, nums + 1, 2):
prime = True
for num in range(3, math.floor(math.sqrt(pr) + 0.1) + 1, 2):
if pr % num == 0:
prime = False
break
if prime:
lst.append(pr)
return([2] + lst)
print(find_primes2(123))
def find_primes3(nums):
import math
if nums < 2:
return []
lst = [2]
for pr in range(3, nums + 1, 2):
prime = True
limit = math.floor(math.sqrt(pr) + 0.1)
for num in lst:
if num > limit:
break
if pr % num == 0:
prime = False
break
if prime:
lst.append(pr)
return(lst)
print(find_primes3(123))
输出:
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59,
61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113]
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59,
61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113]
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59,
61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113]