如何加快寻找过程?

时间:2016-03-30 01:59:11

标签: python loops primes

当我遇到问题时,我在Project Euler上做了问题7。我的代码需要很长时间才能完成。这是我的代码。

def Problem7():
    num = 0
    p = 0 
    while p < 10002 :
        prime = True
        for i in range(2,num):
            if (num%i==0):
                prime = False
        if prime:
           print(num)
           p = p + 1
        num = num + 1
Problem7()

如何让它更快?还有另一种方式吗?

2 个答案:

答案 0 :(得分:3)

你应该让你的生活更轻松,并在最后打印素数,这是我怀疑p变量存储的。

如评论中所述,您可以使用更智能的算法消除大量计算。

1:检查数字是否为偶数(num%2)(如果是,不是素数)

2:当除数小于或等于平方根且prime == True时,测试除数

3:如果仍然不是素数,则增加2,这样你只测试奇数(所有的evens都用num%2检查)

如果你想提高效率,那么每个非素数都至少有一个素数因子,所以你可以存储你在数组中找到的每个素数,并且只检查那些数组中最高的素数......但这是一个对这个问题不必要的额外编码。使用上述逻辑,我在测试运行的几秒钟内找到了前10,000个素数。

如果你想到数字100,你的逻辑会测试99个可能的除数。上面的逻辑测试只有2然后停止。最糟糕的情况是去平方根只有2,3,5,7,9 ... 5计算而不是99。

答案 1 :(得分:1)

我使用以下方法检查数字是否为素数(在0m0.612s中运行):

import math

def is_prime(num):
    if num == 0 or num == 1:
        return False
    if num == 2:
        return True
    temp = 2
    while temp < math.sqrt(num) + 1:
        if num % temp == 0:
            return False
        temp += 1

    return True