繁体   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