【问题标题】:How to count the number of prime numbers?如何计算素数的个数?
【发布时间】:2021-01-05 22:35:40
【问题描述】:

我正在尝试将以下代码的输出存储到列表中

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)

我希望输出在列表[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 之间的素数。

【问题讨论】:

  • 您应该创建并打印numlist 在循环之外
  • 每次内部循环中断时,您都会创建一个新的numlist,替换前一个,并且每次附加值后都会打印它。在外循环之外和之前创建列表,并且只在外循环之外和之后打印一次。这样,您将可以在循环后访问结果列表并打印其len() 解决了第二个问题。
  • 请注意,创建素数列表的方法要快得多。不清楚这对你是否重要。
  • 添加到@MarkRansom,“范围内的所有素数”的典型(也是最容易理解的)解决方案是埃拉托色尼筛。它可以通过多种方式实现(从“比试除法更高效,但可能有点内存消耗”到“比试除法效率”)。
  • @ShadowRanger 一个幼稚的筛子会占用内存,但它不必如此。见stackoverflow.com/q/62899578/5987

标签: python


【解决方案1】:

只需在顶部定义数组并在底部打印所有内容。

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

【讨论】:

    【解决方案2】:

    为了让这个运行更快,你应该使用Sieve of Eratosthenes。可以使用与数字范围相对应的部分筛子位图将其应用于数字范围:

    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 
    

    【讨论】:

      猜你喜欢
      • 2016-08-31
      • 2010-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-16
      相关资源
      最近更新 更多