我正在尝试运行我的代码来尝试解决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))
答案 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
我们浪费空间以避免浪费时间。但同样,对于这一系列的数字,这是不值得的。