python 3质数错误答案产量为什么这段代码给我错误的质因数,例如9,21,.......?

问题描述

primef = []
def i_prime(n) :
    count = 0
    for i in range ( 0,n ):
        for j in range ( 2,i ):
            if (not i % j == 0):
                yield i
                count += 1
            else:
                break


for i in i_prime(45):
    primef.append(i)
primefe = list(set(primef))
print(primefe)

解决方法

您的逻辑似乎有些缺陷。您实际上制作的是一个奇数生成器(考虑为什么)。既然已经回答了该部分,这里有一些提示:

  1. 我不建议这种算法生成素数 效率低下。您也可以缓存所有产生的素数 列表中的数字,并且仅对照该列表而不是 for j in range(2,i):
  2. 还有一种更有效的方法来生成质数 利用数论的事实,即所有素数 大于3的数字采用6k+16k+5的形式,其中k为整数,出于实际目的,该值非负(后面的解释非常简单)。 这是我在解决Project Euler问题时编写的一段代码:
def is_prime(x: int) -> bool:
    if x <= 3:
        return x > 1
    elif x % 2 == 0 or x % 3 == 0:
        return False    
    
    i = 5
    while i*i <= x:
        if x % i == 0 or x % (i + 2) == 0:
            return False
        i = i + 6
    
    return True

这个素数检查器对我有用,可以在0.6s内找到10001st素数(对于欧拉计画问题)。

如果有任何关于此实现的问题,请问我。

,

这是您代码的正确版本-您需要仔细研究所有可能的因素,然后再确定数字不是质数-只要有一个数字不等于质数,您就yield输入值除以。

primef = []
def i_prime(n) :
    for i in range ( 0,n ):
        for j in range ( 2,i ):
            if (i % j == 0):
                break
        else:
            yield i


for i in i_prime(45):
    primef.append(i)
print(primef)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...