【问题标题】:Printing out a certain number of prime numbers打印出一定数量的素数
【发布时间】:2017-05-02 09:09:08
【问题描述】:

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

这是我的指示。

【问题讨论】:

  • 不应该是counter % x而不是x % counter吗?
  • 另外,只有当counter 不能被x 的所有值整除时,您才应该附加到primes
  • 你在primes 中多次添加counter,然后在for 中查看primes 中的值,我猜它提供了一个新版本的无限循环
  • 是的,当我运行我的代码时,没有任何反应,正如你所说的“无限循环”。

标签: python python-3.x


【解决方案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

【讨论】:

  • 这确实有效,但我只是一个初学者,所以我不确定你做过的一些事情。你能让它更接近我的原始代码吗?
  • 现在很累,但这是有道理的。感谢那。 :)
  • 能否请您告诉我 5 是如何出现在素数列表中的。关于本节。如果 x == primes[-1]: primes.append(counter) counter += 2
  • 素数以 2 开头。与 3 相对,因为 3 不是 2 的倍数,所以将 3 添加到素数列表中。然后我们将 2 加到 counter,counter 现在是 5。我们检查 5 是否是 2 的倍数(x=2),这不是所以我们继续在素数列表中:我们检查 5 是否是 3 的倍数(x=3 ),对于循环继续并完成,情况并非如此。 x(=3) 等于 primes[-1] (=3) 所以我们将 5 添加到素数列表中。
  • @Droid2:我做了另一个编辑,有一个案例没有考虑到。
【解决方案2】:

它可能有助于将您的代码分解为多个部分(函数)。您可以取出检查候选人是否为素数的部分(注意您只需对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 个循环:一个用于原始测试,一个用于遍历候选。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 2021-01-31
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多