繁体   English   中英

python中的素数代码是如何工作的?

[英]How the Prime number code in python works?

def is_prime(num):
    for i in range(2,num):
        if (num % i) == 0:
            return False
    return True

def all_primes(num):
    primes = []
    for n in range(2,num+1):
        if is_prime(n) is True:
            primes.append(n)
    return primes

num = int(input("Enter upper limit: "))
primes = all_primes(num)
print(primes)

它是如何发生的... 理解的是,如果我输入 10 它将是 10%2=5...余数为 0 所以它跳到下一个 9%2 = True 有余数。

它移动到下一个 9%3 余数是 0 所以它跳到 8% ...,然后是 7 ......但是我不明白的是 7 如果它检查直到 7%7 ==0 那么如何是不是加了 7 作为素数???

我很困惑。

感谢您的任何评论

但我不明白的是 7 如果它检查到 7%7 ==0

来自以下行的range函数

for i in range(2, num):

2num - 1

因此, range()函数不包括结果中的最后一个(停止)数字。

你理解错了。 如果你输入10 ,它不会检查10%2然后是9%2 ...

它会检查10%2 ,然后是10%3 ,然后是10%4 ... 即它会检查10%i ,因为i范围从29 但是,请注意,一旦余数为 0, is_prime中的执行is_prime停止:

for i in range(2,num):
        if (num % i) == 0:
            return False

因此,如果num10 ,则只会检查10%2 ,并且由于它是0 ,它将立即返回false

例如,如果num9 ,它将检查9%2 由于余数不是0 ,它会向上移动到检查9%3 那里的余数是0 ,所以在这种情况下它会返回false

如果num7 ,它会检查7%2 余数不是0所以它检查7%3 ,这也不同于0 ,依此类推。 最后执行的检查将是7%6 ,因为for i in range(2,num)意味着它将迭代i范围从2num-1 在这种情况下, is_prime(7)将返回true因为7%i ,其中i范围从26不同于0

素数,顾名思义,就是一个只能被它自己和1整除的数。

因此,您的函数is_prime获取您要检查的数是否为素数,并尝试在区间 [2, num) 内找到任何其他可以整除它的数,该区间是使用函数range(2,num)在 for 循环内。

如果它找到任何情况,即如果满足if (num % i) == 0 ,我们知道有一个数可以整除它,因此,根据定义,它不是素数。 检查整个列表后,如果找不到除数,我们可以说该数字是素数,即在您的函数上return True

Example:
You want to check 9
(1st step) num = 9, i = 2. 9%2 != 0, we continue in the loop with next value of i.
(2nd step) num = 9, i = 3. 9%3 == 0, we return False. As we know, 9 can divide by 3.

Another example:
You want to check 7
num = 7, i = 2 7%2 != 0, so we continue in the loop with the next value of i
num = 7, i = 3 7%3 != 0, so we continue in the loop with the next value of i
num = 7, i = 4 7%4 != 0, so we continue in the loop with the next value of i
num = 7, i = 5 7%5 != 0, so we continue in the loop with the next value of i
num = 7, i = 6 7%6 != 0, so we continue in the loop with the next value of i

The if was never fulfilled, therefore we reach the end of the loop and 
call the next command, which is return True. 

当为编号7调用is_prime时,循环将仅从2运行到6 因此永远不会检查7%7 ,在这种情况下返回 True 。

让我们分别考虑这两个函数:

def is_prime(num):
    for i in range(2,num):
        if (num % i) == 0:
            return False
    return True

这像这样工作:

  • 让我们考虑一个数字num
  • 得到一个变量i来假设值2
  • 评估条件num % i == 0
  • 如果满足条件,则退出函数并返回False
  • 否则将i增加 1 并重复最后两步直到i等于num - 1
  • 退出函数并返回True

因此,这永远不会评估7 % 7 :当num7时, i的最后一个值为6


def all_primes(num):
    primes = []
    for n in range(2,num+1):
        if is_prime(n) is True:
            primes.append(n)
    return primes

这会得到一个数字num ,这是要考虑的数字的上限,然后:

  • 它创建一个名为primes的空list
  • 它从2循环n直到排除num + 1 (或包括num
  • 如果is_prime(n)的结果为 True,则将数字附加到list
  • 最后,返回primeslist

最后是脚本的主体:

num = int(input("Enter upper limit: "))
primes = all_primes(num)
print(primes)

从键盘获取一个字符串,将其转换为int并分配给num ,然后调用all_primes(num)并将其结果分配给primes并将list打印到屏幕。


因此,当您从键盘输入10时,它会检查从210的值是否为is_prime()素数,而不是从10并减少它们,正如您似乎建议的那样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM