【问题标题】:'Generator' for Prime numbers in a range范围内素数的“生成器”
【发布时间】:2021-07-07 19:54:16
【问题描述】:

请有人帮我解决这个我被困了好几个星期的hackerrank问题! 我正在定义一个有 2 个参数的函数。参数 'num' 是一个整数,是必须生成素数的范围,参数 'val' 包含 0 或 1。但它还有另一个条件: 'num' 值为 21 的质数是 - 2 3 5 7 11 13 17 19

  1. 如果 'val' 的值为 0,则产生以下值:3 7 13 19 [奇数索引值]
  2. 如果 'val' 为 1,则产量值应为:2 5 11 17 [偶数索引值]

我试过下面的代码

def primenum(num, val):
    for i in range(3-val,num):
        if(i > 2):          
            for j in range(2,i):
                if(i%j == 0):
                    break
                else:
                    yield i

【问题讨论】:

  • 您是否尝试过首先生成直到num 的所有素数并从那里开始?
  • 记录你找到的素数数量,然后以 2 为模。
  • 这看起来像您在编写代码时寻求帮助 - 从技术上讲,这不是 SO 的主题,因为这是一个关于一般答案的网站。如果您可以将其编辑为更一般的问题,我将不会关闭。如果你真的需要帮助编写这个函数,你可能想试试codereview.stackexchange.com
  • 话虽如此,我会指出您不需要检查整个范围(2, i)。对于任何 i,存在一个数 j,使得对于 i 的任何一对因子 x、y,x、y 中的至少一个小于或等于 j。您可以将其视为“i 的乘法中点”。我会把它作为一个有趣的练习让你找到那个中点:)
  • @JonKiparsky codereview 不是为了帮助编写代码。

标签: python python-3.x generator yield


【解决方案1】:

如果要在生产环境中使用它,您应该使用更有效的算法来生成素数,但要使用您目前所拥有的:

def primenum(num,val):
    prime_count = 0
    for test_number in range(2,n):
        has_prime_factor = False
        for comparison in range(2,test_number):
            if test_number % comparison == 0:
                has_prime_factor = True
                break
        if not has_prime_factor:
            prime_count += 1
            if prime_count % 2 == val:
                yield test_number

【讨论】:

    【解决方案2】:

    希望这会有所帮助:

    def primenum(num, val):
        primes = []
        for i in range(2, num):
            for j in range(2, int(i / 2) + 1):
                if i % j == 0:
                    break
            else:
                primes.append(i)
            
        for i in range(1 - val, len(primes), 2):
            yield primes[i]
    
    prime1 = list(primenum(21, 0)) # [3, 7, 13, 19]
    prime2 = list(primenum(21, 1)) # [2, 5, 11, 17]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-25
      • 2010-12-24
      • 1970-01-01
      • 2021-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多