簡體   English   中英

如何從范圍生成器中打印出不能被給定列表中的任何數字整除的數字

[英]How to print out numbers from a range generator that are not divisible by any numbers in a given list

我正在嘗試打印出一定范圍內的素數,並決定使用 Eratosthenes 的分段篩來 go 找到從 2 到 sqrt(n) 的素數,並使用列表中找到的素數打印出素數任何范圍,使得范圍內的數字不能被篩列表中的任何數字整除最終成為素數。

我的代碼適用於小范圍,例如從 2 到 10 和 3 到 5,但開始打印出重復項以及大 n 的非素數。 有什么幫助解決這個問題嗎?

from math import sqrt, ceil    

#Creating segmented sieve  

start=2    
stop=1000000000    
sieve=[i for i in range(2,ceil(sqrt(stop)+1))]    
for num in range(0,len(sieve)):    
        num2=num+1    
        while num2<len(sieve):    
            if sieve[num2]%sieve[num]==0:    
                sieve.pop(num2)    
                num2+=1    
            else:    
                num2+=1

#printing primes from start to stop using primes in sieve to ignore their multiples
    
for n in range(start,stop+1):    
    if n==sieve[0]:    
        print(n)    
        continue    
    if n%sieve[0]==0:    
        continue
    else:    
        p=1    
        while p<len(sieve):    
            if n==sieve[p]:    
                print(n)    
                p+=1    
                continue   
            if n%sieve[p]==0:
                p+=1
                continue
            else:
                p+=1
                print(n)

問題出在while循環中。 如果滿足循環中的條件之一,則意味着您找到了一個素數,因此您應該“中斷”循環而不是打印並繼續。 並且,為了確保篩選列表中的所有數字都檢查該數字,一個最終條件集,以便僅在不滿足其他條件並且已到達篩選列表末尾時才中斷。

     while p < len(sieve):
        if n == sieve[p]:
            print(n)
            break
        if n % sieve[p] == 0:
            break
        if p == (len(sieve)-1):
            print(n)
            break
        else:
            p += 1

Output:

2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97

暫無
暫無

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

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