【问题标题】:generate non-prime numbers for a range in python在python中为一个范围生成非质数
【发布时间】:2019-06-20 08:12:36
【问题描述】:

我们必须生成一个 python 函数来返回非质数。 例如,如果我们传递10,它应该返回1 4 6 8 9 10 12 14 15 16

这是我迄今为止尝试过的:

def np_generator(n):
    str1 = [1]
    for num in range(2, 100):
        if num > 1:
            for i in range(2, num):
                if (num % i) == 0:
                    str1.append(num)
                    break
                if(len(str1)==n):
                    print(str1)
        else:
            None
        pass

它的输出接近解决方案: 当我将12 作为n 传递时,它会返回:

1
[1]
2
[1, 4]
[1, 4]
[1, 4]
3
[1, 4, 6]
[1, 4, 6]
[1, 4, 6]
[1, 4, 6]
[1, 4, 6]
4
[1, 4, 6, 8]
5
6
[1, 4, 6, 8, 9, 10]
[1, 4, 6, 8, 9, 10]
[1, 4, 6, 8, 9, 10]
[1, 4, 6, 8, 9, 10]
[1, 4, 6, 8, 9, 10]
[1, 4, 6, 8, 9, 10]
[1, 4, 6, 8, 9, 10]
[1, 4, 6, 8, 9, 10]
[1, 4, 6, 8, 9, 10]
7
[1, 4, 6, 8, 9, 10, 12]
[1, 4, 6, 8, 9, 10, 12]
[1, 4, 6, 8, 9, 10, 12]
[1, 4, 6, 8, 9, 10, 12]
[1, 4, 6, 8, 9, 10, 12]
[1, 4, 6, 8, 9, 10, 12]
[1, 4, 6, 8, 9, 10, 12]
[1, 4, 6, 8, 9, 10, 12]
[1, 4, 6, 8, 9, 10, 12]
[1, 4, 6, 8, 9, 10, 12]
[1, 4, 6, 8, 9, 10, 12]
8
[1, 4, 6, 8, 9, 10, 12, 14]
9
10
[1, 4, 6, 8, 9, 10, 12, 14, 15, 16]
[1, 4, 6, 8, 9, 10, 12, 14, 15, 16]
[1, 4, 6, 8, 9, 10, 12, 14, 15, 16]
[1, 4, 6, 8, 9, 10, 12, 14, 15, 16]
[1, 4, 6, 8, 9, 10, 12, 14, 15, 16]
[1, 4, 6, 8, 9, 10, 12, 14, 15, 16]
[1, 4, 6, 8, 9, 10, 12, 14, 15, 16]
[1, 4, 6, 8, 9, 10, 12, 14, 15, 16]
[1, 4, 6, 8, 9, 10, 12, 14, 15, 16]
[1, 4, 6, 8, 9, 10, 12, 14, 15, 16]
[1, 4, 6, 8, 9, 10, 12, 14, 15, 16]
[1, 4, 6, 8, 9, 10, 12, 14, 15, 16]
[1, 4, 6, 8,{-truncated-}

预期的输出是:

1
4
6
8
9
10
12
14
15
16
18
20

【问题讨论】:

  • 这里有什么生成器?
  • generator 将从这个函数中打印出 +ve 非质数。
  • 为什么将生成器作为函数参数传递?如果你在它之后使用为什么处理?
  • 嗨@prashantrana 我也添加了generator 的代码,请看一下!
  • 但生成器在该函数中未使用。为什么要通过?请注意,您还有许多其他错误:集合没有 append 方法,while 循环永远不会结束,因为 n 总是大于 1,等等。

标签: python python-3.x primes


【解决方案1】:
from math import sqrt
def is_prime(num):
    for i in range(2,int(sqrt(num))+1):
        if num % i == 0:
            return False
    return True
def yield_np(n):
    np_counter = 1
    num_to_print = 1
    while np_counter <= n:
        if num_to_print == 1 or is_prime(num_to_print) == False:
            yield num_to_print
            np_counter+=1
        num_to_print+=1
if __name__ == "__main__":
    n = int(input())
    if n > 0:
        for i in yield_np(n):
            print(i)
    else:
        print()

【讨论】:

  • 嗨@ParthS007 我怎样才能向生成器生成非质数,所以它只能打印非质数?
  • 尝试输入 10。大多数编码挑战不会要求您提示。所以我没有给出像“输入n值”这样的提示。只需运行程序并提供输入
  • 我在问题中添加了Latest Update,请看一下!我在那里做错了什么?
  • 我不明白你的逻辑,为什么你有嵌套函数?我已经为您的问题提供了解决方案。
  • 正如我所说,这是一个代码挑战,所以我只有一个函数需要我编写完整的代码,那就是我以这种方式调整它。
【解决方案2】:
def is_prime (x):
    """
    check a number is prime or not
    """
    return True if x in [2,3] else not any (x % n == 0 for n in range (2, int (x ** 0.5) + 1))

def non_prime(n):
    """n = no of non prime user want"""
    non_prime =[1] # list of non prime
    value = 3 # settign counter to start 
    while len(non_prime) < n :
        """looping till  length of non prime reached to n"""           
        if not is_prime(value):
            """ if number is not prime, adding that value to non prime"""
            non_prime.append(value)
        value +=1 # incrementing value after each iteration
    return non_prime # return non prime values

    res = non_prime(10)
    print(res)

输出

[1, 4, 6, 8, 9, 10, 12, 14, 15, 16]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 2018-10-02
    • 2011-08-02
    • 1970-01-01
    • 2012-12-01
    相关资源
    最近更新 更多