我正在尝试打印出用户输入的一些素数,例如,如果用户输入10,它将打印出前10个素数。
users_prime = int(input("How many primes do you want to find"))
primes = [2]
counter = 2
while len(primes) < users_prime:
for x in primes:
if x % counter:
primes.append(counter)
counter += 1
if x % counter == 0:
counter += 1
print("The prime numbers are:", primes)
答案 0 :(得分:1)
users_prime = int(input("How many primes do you want to find"))
primes = [2]
counter = primes[0]+1
while len(primes) < users_prime:
for x in primes:
if counter % x:
continue
else:
break
if x == primes[-1]:
primes.append(counter)
counter += 2
print("The prime numbers are:", primes)
步骤:将计数器初始化为第一个素数加一个。检查您检查的号码是否不能被前一个素数除数。如果没有,请将此号码添加到素数列表中。将+2添加到计数器以避免偶数。
修改:此解决方案不是最快的解决方案。如果需要,我们可以提高速度。
输出:('The prime numbers are:', [2, 3, 5, 7, 11])
编辑2:
第一点,counter
的初始化,你知道2是素数,所以不需要检查它。它已经在素数列表中。所以你可以将它初始化为下一个整数。 (这里3或prime[0]+1
)
然后,您的第一个if
:它必须是counter % x
,因为您要检查counter
是否为素数。否则(你的版本),你检查你的素数是否可被counter
整除,即你假设的数字是素数(除非算法告诉你)。
在我的版本中,我检查counter
是否可被任何先前的素数整除。如果它不可分割,我会继续。如果counter
是任何素数的倍数,则它会进入else
,因此我的for
循环会被破坏。因此,如果counter
是任何素数x
的倍数,则不等于素数的最后一个元素。如果是这样,我什么也没做。否则,我将x
添加到素数列表中。
对于counter += 2
,它将避免4,6,8,10,...,2 * i对应于偶数(不能是素数)
编辑3:
为了正确,你应该实际使用布尔(我道歉,我以前没有意识到)。否则如果counter
是prime[-1]
的倍数,它仍会添加到主要列表中。
isprime = True
for x in primes:
if counter % x:
continue
else:
isprime = False
break
if isprime:
primes.append(counter)
counter += 2
答案 1 :(得分:1)
将代码分解为部分(函数)可能会有所帮助。你可以拿出检查候选人是否是素数的部分(注意你只需要进行sqrt(candidate)
的试验分割;你只需要检查奇数:
# from itertools import count
from math import ceil, sqrt
users_prime = int(input("How many primes do you want to find? "))
primes = [2]
def check_prime(candidate):
mx = ceil(sqrt(candidate)) # need only check up to mx
for prime in primes:
if candidate % prime == 0:
return False
if prime >= mx:
return True
# for candidate in count(start=3, step=2):
candidate = 1
while True:
candidate += 2 # checking 3, 5, 7, 9, ... only
if check_prime(candidate):
primes.append(candidate)
if len(primes) >= users_prime:
break
print("The prime numbers are:", primes)
评论的部分(使用itertools.count
)只是比3, 5, 7, ...
循环更好地迭代while True
。
你在这段代码和你的代码之间看到的差异(除了你的测试x % counter
是错误的方式之外)是你检查质数并接受测试是否在同一循环中失败(没有首先测试了所有素数);我的例子有2个循环:一个用于primalty测试,一个用于循环候选。