我需要在此列表中找到素数

时间:2019-02-23 00:09:01

标签: python python-3.x

我想从具有以下规范的列表中找到素数: A)如果数字是质数,则代码应显示“ [数字]是质数”。 B)如果数字不是素数,则应打印“ [number]不是素数”,以及该数字的因数(除1和数字本身以外):“ [factor]是[number]的因数]”。

check_prime = [26, 39, 51, 53, 57, 79, 85].
for num in check_prime:
    for i in range(2, num):
        if (num % i) == 0:
            print("{} is NOT a prime number, because {} is a factor of {}".format(num, i, num))
            break

    if i == num -1:    
        print("{} IS a prime number".format(num))

有人可以解释此代码吗?我不明白为什么会有num-1个素数。为什么我们在那里没有使用else语句?

3 个答案:

答案 0 :(得分:1)

答案是range(2, num)生成从2到num-1的数字,因为range(0,n)生成的数字通常从0到n-1。因此,您的i将从2到num-1。这就是为什么您检查if i == num -1:来查看i的所有值是否都已用于检查素数的原因。

答案 1 :(得分:1)

这是草率的代码。

逻辑是,当且仅当您经历了所有可能的因素均小于数字时,该数字才是质数。在这种情况下,i == num-1

有更好的方法来确定数字是否为质数。您可以搜索“确定主要的Python”并以更好的代码和更直接的逻辑获得很多成功。

例如,这更清楚:

import math

check_prime = [26, 39, 51, 53, 57, 79, 85].
for num in check_prime:
    is_prime = True
    for i in range(2, int(num**0.5) + 1):
        if (num % i) == 0:
            is_prime = False
            break

    if is_prime:    
        print("{} IS a prime number".format(num))
    else:
        print("{} is NOT a prime number, because {} is a factor of {}".format(num, i, num))

您更容易跟随吗?

答案 2 :(得分:1)

由于内部循环在i上迭代range(2, num),如果循环由于发现而没有遇到i,则num - 1最终将变成break除数,即如何确定质数。

或者,您可以使用for-else构造实现以下目标:仅当循环没有以更简洁的方式遇到break时,才能确定数字为质数:

for num in check_prime:
    for i in range(2, num):
        if (num % i) == 0:
            print("{} is NOT a prime number, because {} is a factor of {}".format(num, i, num))
            break
    else:
        print("{} IS a prime number".format(num))