打印出一定数量的素数

时间:2017-05-02 09:09:08

标签: python python-3.x

我正在尝试打印出用户输入的一些素数,例如,如果用户输入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)

以下是我的指示。 Here are my instructions

2 个答案:

答案 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: 为了正确,你应该实际使用布尔(我道歉,我以前没有意识到)。否则如果counterprime[-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测试,一个用于循环候选。