Python打印非素数

时间:2019-07-13 16:40:23

标签: python loops

我有一个hackkerank编码挑战,要打印前n个非素数,我有工作代码,但是问题是,他们有一个锁定代码,该代码将输出从1到n的数字与输出一起打印,以便通过测试我只需要打印非质数而不是1 ... n数字。我无法评论1 ... n的打印部分,因为它已被阻止。请让我知道仅打印1st n个非质数的想法:

这是我的解决方法:

def manipulate_generator(generator, n):
    if n>1:
    ls=[1]
    for elm in generator:
        if elm>3 and len(ls)<n:
            for k in range(2,elm):
                if elm%k==0 and elm not in ls:
                    ls.append(elm)
                    print(elm)
                    if len(ls)==n:
                        return ls

那是我添加的代码,但是这是被锁定的代码,我必须编写上面的代码以使其一次打印出第一位

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)

关键点是_的范围(k):已经打印出包含不希望打印出的数字的数字:这是我想要的输出类型:n = 10我希望将其打印出: 输出:

1
4
6
8
9
10
12
14
15
16

我无法更改此代码,但是上面的代码是我写的,可以更改...请帮帮我...谢谢您期待

5 个答案:

答案 0 :(得分:0)

您可以打印从1到第一个素数的所有数字,然后从第一个素数到下一个素数,直到达到n。

答案 1 :(得分:0)

我不确定您的hackerrank情况如何,但是可以通过这种方式有效地打印前N个非素数数字。

def non_prime_numbers_till_n(n):
    primes = set()
    for num in range(2,number + 1):
        if num > 1:
           for i in range(2, math.sqrt(num)):
               if (num % i) == 0:
                  break
               else:
                  primes.add(num)
     result = []
     for i in range(1, n):
         if i not in primes:
            result.append(i)
     return result

根据在线编辑的期望,您可以打印它们,或将它们存储在列表中并返回列表。

请记住,您最多只能检查数字的平方,以确定其是否为素数。

答案 2 :(得分:0)

我最终想出了这个答案,我相信应该可以解决,但请在那里找到答案;一种更好的解决方法,请添加答案:

def manipulate_generator(generator, n):
    for num in range(3,100000):
        for q in range(2,num):
            if num%q==0 and num>n:
                generator.send(num-1)
                return

此链接python generator帮助我了解python生成器

答案 3 :(得分:0)

为什么不扔掉我们不需要的数字?看看我实现的这个解决方案...

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

def manipulate_generator(generator, n):
    if is_prime(n+1):
        next(generator)
        manipulate_generator(generator, n+1)

注意:我了解可以改进逻辑以使其更有效。但是,跳过不必要的数字打印的想法在这里很重要!

答案 4 :(得分:0)

我刚刚解决了这个问题。就像Swapnil Godse所说的那样,您需要处理所有特殊情况以优化计算。该链接可能会有所帮助:click here.

这是解决方案:

from math import sqrt

def is_prime(n):
    if (n <= 1):
        return False
    if (n == 2):
        return True
    if (n % 2 == 0):
        return False

    i = 3
    while i <= sqrt(n):
        if n % i == 0:
            return False
        i = i + 2

    return True

def manipulate_generator(g, n):
    if is_prime(n+1):
        next(g)
        manipulate_generator(g, n+1)