【问题标题】:python 3 prime number wrong answer yield why this code give me wrong prime factor like 9,21,.......?python 3素数错误答案产生为什么这段代码给我错误的素数,如9,21,.......?
【发布时间】:2020-12-24 15:46:42
【问题描述】:
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)

【问题讨论】:

    标签: python yield prime-factoring


    【解决方案1】:

    您的逻辑似乎有些缺陷。你所做的基本上是一个奇数生成器(想想为什么)。由于这部分已经回答,这里有一些提示:

    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.6 秒内找到第 10001 个素数(对于欧拉计划问题)。

    如果您有任何与此实施相关的问题,请向我提问。

    【讨论】:

      【解决方案2】:

      这是您的代码的更正版本 - 在确定一个数字不是素数之前,您需要检查所有可能的因素 - 只要有一个数字不被除以,您就是 yielding 该值.

      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)
      

      【讨论】:

      • primef = list(i_prime(45))
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-19
      • 1970-01-01
      相关资源
      最近更新 更多