Python脚本未完成

时间:2017-08-01 17:34:38

标签: python python-3.x

我正在尝试运行我的代码来尝试解决euler问题编号10.我是python的新手,我的代码进展非常缓慢,在这种情况下永远不会结束。任何帮助,将不胜感激。谢谢。

primes = [2]
number = 2

y=1
while y <=1:
    for i in primes:
        if number % i == 0:
            break
        else:
            if i == primes[-1]:
                primes.append(number)
                if (primes[-1]) >= 2000000:
                    del primes[-1]
                    y += 2
    number+=1
print(sum(primes))

2 个答案:

答案 0 :(得分:1)

SPOILER ALERT:以下内容包含Project Euler中问题10的答案。

你的问题是你的代码运行时间太长,这是因为它检查了太多东西而且需要很长时间才能运行。在PE问题中,你通常需要考虑一个技巧来让你的程序足够快地获得结果。在这种情况下,你需要理解为什么不需要检查天气,素数可以被一个大于平方根的素数整除。

  

如果一个数字x可以被一个大于p的平方根的素数x整除,那就意味着有一个自然数n那是n = x/p,如果p大于x的平方根,则n小于x的平方根(想想为什么这是x真正)。这意味着我们会发现数字n也可以被x整除,该数字小于x的平方根。这意味着当我们检查所有小于n的平方根的数字时,我们已经发现x可以被import math primes = [2] is_prime = True # loop over all the ODD numbers from 3 to 2,000,000 (no need to check even numbers) for number in xrange(3, 2000000 + 1, 2): sqrt = math.sqrt(number) # loop over all the primes we have so far for prime in primes: # if the number we are checking is divisible by a prime it is not prime and we can move on to the next number if number % prime == 0: # we set this value to false so that when we finish the loop we will be able to know if the number is prime or not is_prime = False break # this line is where the clever part is, if we already checked `all the primes that are smaller than square root of x, and we did not find any primes that our number is divisible by, then we will not find any primes higher than the square root of the number that the number is divisible by` if prime > sqrt: break if is_prime: primes.append(number) else: is_prime = True # we are done, print the answer print sum(primes) (或n的素因子)整除,因此,没有必要检查任何数字,然后数字的平方根是为了知道它是否是素数QED。

这样您可以节省大量计算。以下是实现这个想法的python程序:

daysOfWeek.Length

答案 1 :(得分:1)

尽管我很欣赏@DonatPants的详细解答,但我认为解决方案太复杂了。首先,我们不需要计算sqrt()时更简单的方格(即方程的两边都是。)其次,测试顺序似乎是向后的,为什么在{{1}之后检查prime > sqrt }?如果if number % prime == 0,则不需要其他测试。什么是布尔值?我解决这个问题的方法比较简单:

prime > sqrt

冗余计算primes = [2] for number in range(3, 2000000 + 1, 2): # only test odd numbers for prime in primes: if prime * prime > number: # we're past sqrt, a prime! primes.append(number) break if number % prime == 0: # a composite break print(sum(primes)) 效率低下。它对这个数字范围没有任何影响,但如果需要,你可以保留一个单独的正方形数组,枚举素数并使用生成的索引来访问正方形,保存素数时保存。仅仅瞄准素数比平均根数所有数字便宜:

prime * prime

我们浪费空间以避免浪费时间。但同样,对于这一系列的数字,这是不值得的。