簡體   English   中英

如何計算素數的個數?

[英]How to count the number of prime numbers?

我正在嘗試將以下代碼的 output 存儲到列表中

lower = int(input("Enter the begining of the range: "))
upper = int(input("Enter the end of the range: "))
print("Prime numbers between", lower, "and", upper, "are:")

for num in range(lower, upper + 1):
   if num > 1:
       for i in range(2, num):
           if (num % i) == 0:
               break
       else:
           numlist = []
           numlist.append(num)
           print(numlist)

我期待 output 在列表[p1, p2, p3,...pn]內。 但是,我最終得到以下結果:

Enter the begining of the range: 1
Enter the end of the range: 10
Prime numbers between 1 and 10 are:
[2]
[3]
[5]
[7]

這種方法是正確的還是有更好的方法來滿足要求? 我還嘗試添加一行代碼,讓用戶可以看到 (4) 個介於 1 和 10 之間的素數。

只需在頂部定義數組並在底部打印所有內容即可。

lower = int(input("Enter the begining of the range: "))
upper = int(input("Enter the end of the range: "))

print("Prime numbers between", lower, "and", upper, "are:")
numlist = [] #this line
for num in range(lower, upper + 1):
   if num > 1:
       for i in range(2, num):
           if (num % i) == 0:
               break
       else:
           
           numlist.append(num)
          

print(numlist) # and this line

為了使這個運行得更快,你應該使用Eratosthenes 的篩子 它可以使用與數字范圍相對應的偏篩 bitmap 應用於數字范圍:

def primesInRange(a,b):
    isPrime = [True]*(b-a+1)                  # partial sieve
    if a < 2: isPrime[:2-a] = [False]*(2-a)   # 0 and 1 are not primes
    for p in (2,*range(3,int(b**0.5)+2,2)):   # scan divisors up to √b
        base = (p - a%p)%p + p*(p>=a)         # first multiple in partial sieve
        isPrime[base::p] = [False]*len(isPrime[base::p])    # flag non-primes
    return [p for p,prime in enumerate(isPrime,a) if prime] # return primes

primes = primesInRange(150,200)

print(*primes)
# 151 157 163 167 173 179 181 191 193 197 199

print(len(primes))
# 11

print(len(primesInRange(100100000,100200000))) # speed challenge
# 5493 

暫無
暫無

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

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