Python非素数生成器

Python非素数生成器,python,generator,primes,Python,Generator,Primes,我需要这项任务的帮助: 给定一个整数k,打印前k个非素数正整数, 每个人都在一条新的线上 我试了好几种方法,但似乎都没能成功。有没有办法找到这个解决方案 这是我的密码: def manipulate_generator(generator, n): # Enter your code here new_number = [] for x in range(1, n): if n % x == 0: new_number

我需要这项任务的帮助:

给定一个整数k,打印前k个非素数正整数, 每个人都在一条新的线上

我试了好几种方法,但似乎都没能成功。有没有办法找到这个解决方案

这是我的密码:

def manipulate_generator(generator, n):
    # Enter your code here
      new_number = []

      for x in range(1, n):
          if n % x == 0:
            new_number.append(x)


      return new_number

你可以使用一个集合来存储你已经找到的素数,并尝试将每个候选整数n除以已知的素数,如果它是可整除的,则得到这个数;否则,将该数字作为素数存储到集合中。继续增加n,直到产生k个非素数。首先生成1,因为它是唯一不能被素数整除的非素数:

def nonprimes(k):
    if k > 0:
        yield 1
    primes = set()
    n = 2
    while k > 1:
        for prime in primes:
            if n % prime == 0:
                yield n
                k -= 1
                break
        else:
            primes.add(n)
        n += 1
以便:

for n in nonprimes(10):
    print(n)
产出:

1
4
6
8
9
10
12
14
15
16

我最近也被问到同样的问题。它已经有了一些现有的代码,我所要做的就是完成“操纵生成器”的代码

现行守则:

def positive_integers_generator():
n = 1
while True:
    x = yield n
    if x is not None:
        n = x
    else:
        n += 1


k = int(input())
g = positive_integers_generator()
for _ in range(k):
    n = next(g)
    # print(n)
    manipulate_generator(g, n)
我的用于检查素数的生成器和支持函数的代码:

from math import sqrt

# function to check if a given number is prime
def check_prime(n):
    is_prime = True
    for num in range(2, int(sqrt(n)) + 1):
        if n % num == 0:
            is_prime = False
            break
    return is_prime


def manipulate_generator(generator, n):
    # flag to ensure that manipulate_generator prints only one value per iteration
    printed = False
    
    while not printed:
        if n == 1:
            # printing 1 by default as its the first non-prime
            print(1)
            # update the flag to indicate value being printed and exit the while loop
            printed = True
        else:
            # check for the number to be prime
            is_prime = check_prime(n)
            
            # if its a non-prime number, print it
            if not is_prime:
                print(n)
                # update the flag to indicate value being printed and exit the while loop
                printed = True
            else:
                # if a prime number is encountered, generate the next number
                n = next(generator)

此代码在允许的范围内执行并获得所需的输出。

首先,您的问题有几个问题。尽管“生成器”一词出现在标题中,在代码中出现了两次,但实际的问题描述与Python生成器没有任何关系

其次,示例代码sorta将k作为参数n,但非素数计算本身不应包含此参数。这只是计算已经发现了多少。看起来您从某个地方获取了试图解决另一个问题的代码

我喜欢@blhsing基于生成器的解决方案+1,除了他们使用集合来保存素数,因为集合没有顺序。这是一个效率问题,原因有二。首先,在尝试大素数之前,我们不尝试小素数,这将取消我们感兴趣范围内更多数字的资格。所以我们可以做一些不必要的划分。第二,如果一些素数大于我们正在测试的数字的平方根,那么就不应该使用它们。这些绝对是不必要的划分

这是我的解决方案,它非常类似,但使用一个素数列表来减少划分的数量。请注意,它是一个Python生成器,尽管还不清楚这是您想要的还是返回一个复合列表:

def composite_generator(k):
    number = 1

    if k > 0:
        yield number
        k -= 1

    number += 1

    primes = []

    while k:
        for divisor in primes:
            if divisor * divisor > number:
                primes.append(number)
                break

            if number % divisor == 0:
                yield number
                k -= 1
                break
        else:  # no break
            primes.append(number)  # for 2 and extremely large prime gaps

        number += 1

print(*composite_generator(20), sep='\n')
基于我所写的素代代码,我相信在这些相对较小的范围内,保留一个素数列表只会提高10%左右的性能。在单独处理偶数之后,使用奇数除数通常就足够了


我认为@Prune关于首先研究素数生成器的部分建议是个好主意。我会更进一步说,首先实现素数生成器,然后将其转换为复合生成器。

首先,我建议您研究如何生成素数。然后颠倒逻辑:保留素数列表,但打印那些不是素数的。在你准备在这里发帖之前,你还有一点工作要做。对不起,我发现你的最后一句话是贬义的。。。一个准备好学习的人不应该被这样说。我相信在你的一生中有一段时间你什么都不知道我为你的含糊不清道歉。这是一个非常广泛的指导,而不是贬损性的评论。当你发帖时,我们假设你已经完成了介绍性的参观。我正在解释为什么你会获得否决票和结束票:你还没有达到发布指南,在这里申请。另见。