【问题标题】:Problem with finding prime numbers in range在范围内查找素数的问题
【发布时间】:2020-11-15 10:50:50
【问题描述】:

节目说明:

程序接受一段 N 个数字,在我的例子中是 [1024, 289213]。然后它应该输出这个段内所有素数的总和。

我的解决方案:

for i in range(1024, 289213):
    isPrime = True
    for j in range(2, i // 2):
        if (i % j) == 0:
            isPrime = False
            break
    if isPrime:
        n += i
print(n)

问题:该程序可以完美地处理小片段,例如 [3,17],但是如果是 [1024, 289213],则需要永远加载。

问题的根源可能是什么?也许有更好的编码方式?提前谢谢你。

【问题讨论】:

  • 想想要检查多少个组合,你就知道为什么要花很长时间了。识别素数有更有效的算法,也许你会找到更好的解决方案。
  • 另外,Python 中的循环非常慢。如果这对您来说是可能的,那么用 C 或几乎所有其他语言编写相同的算法将导致运行时更小。像 numba 这样的 Python 库也将有助于加快您的代码速度。
  • @NiklasMertsch 感谢您的建议,但在此特定任务中需要使用普通 Python)
  • 那么另一种更有效的算法可能是要走的路。将内部循环更改为 any 和生成器表达式的组合也可能会有所帮助。您可以使用multiprocessing 并行化外循环,但这是一个相当大的变化。 sieve of Eratosthenes 是一个不错的选择。

标签: python


【解决方案1】:

这组代码将解决你面临的问题:

from math import sqrt 

# Function to compute the prime number 
# Time Complexity is O(sqrt(N)) 
def checkPrime(numberToCheck) : 

    if numberToCheck == 1 : 
        return False

    for i in range(2, int(sqrt(numberToCheck)) + 1) : 

        if numberToCheck % i == 0 : 
            return False

    return True

def primeSum(l, r) : 

    sum = 0

    for i in range(r, (l - 1), -1) : 

        # Check for prime 
        isPrime = checkPrime(i) 
        
        if (isPrime) : 

            # Sum the prime number 
            sum += i 

    return sum

# Time Complexity is O(r x sqrt(N)) 
 
if __name__ == "__main__" : 

    l, r = 1024, 289213

    # Call the function with l and r 
    print(primeSum(l, r)) 

输出:

3463762527

请注意,获取输出需要几秒钟。

【讨论】:

  • 这只是将i 的上限从i//2 更改为int(sqrt(i))+1,对吧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多