簡體   English   中英

Python 打印非質數

[英]Python print non-prime numbers

我有一個 hackkerank 編碼挑戰來打印前 n 個非素數,我有工作代碼,但問題是他們有一個鎖定的代碼,它打印從 1 到 n 的數字以及 output,為了通過我需要的測試只打印非素數而不是 1...n 數字。 我無法評論 1...n 的打印部分,因為它被阻止了。 請讓我知道只打印第一個 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)

關鍵是 for _ in range(k): 已經打印出數字,其中包括我不想打印出來的數字:這是我想要的 output 的類型:對於 n=10 我希望它打印出來:output:

1
4
6
8
9
10
12
14
15
16

我無法更改此代碼,但上面的代碼是我寫的並且可以更改...請幫助我...謝謝期待

為什么不扔掉我們不需要的數字? 看看我實施的這個解決方案......

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)

注意:我知道可以改進邏輯以使其更有效率。 但是,跳過不必要的數字打印的想法在這里很重要!

您可以打印從 1 到第一個素數的所有數字,然后從第一個數字到下一個數字,直到達到 n。

我不確定您的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

根據您的在線編輯器的期望,您可以打印它們,或將它們存儲在列表中並返回列表。

還要記住,您只能檢查數字的 sqrt 以確定它是否是素數。

我最終想出了這個答案,我認為應該可以解決它,但在那里找到了答案;解決它的更好方法請添加您的答案:

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 生成器幫助我理解了 python 生成器

我現在剛剛解決了這個問題。 就像 Swapnil Godse 所說,您需要處理所有特殊情況以優化計算。 此鏈接可能會有所幫助: 單擊此處。

這是解決方案:

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) 
prime = int(input('Please enter the range: '))

prime_number = []

for num in range(prime):
    if num > 1:
        for i in range(2,num):
            if num % i == 0:
                break
        else:
            prime_number.append(num)
        
print(f'Prime numbers in range {prime} is {prime_number}')

all_number = []
for i in range(2,prime+1):
    all_number.append(i)



Non_prime_number = []

for element in all_number:
    if element not in prime_number:
        Non_prime_number.append(element)

print(f'Non Prime numbers in range {prime} is {Non_prime_number}')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM