我正在解決的問題Project Euler上的50 th問題。連續的總理
的問題是:
請看下面一百萬的素數,這可寫爲最連貫的質數的和。
例如,41 = 2 + 3 + 5 + 7 + 11 + 13
41
是可以寫爲最連貫的素數之素數。
我寫了一個代碼來找到1000
以下的素數,可以寫成最連續的素數之和,來檢查我的代碼是否找到素數(953
),它可以寫成最大的總和連續素數低於1000
。這是我想出了:
#!/usr/bin/python
import prime
p = prime.genprimes(1000)
prms = [i for i in p]
for prm in prms:
count = 0
p = prm
temp = []
for a in prms:
p -= a
temp.append(a)
count += 1
if p == 0:
print prm, '\t', count, '\t', temp
prime.py
:
#!/usr/bin/python
def genprimes(limit):
"""
Returns the prime numbers(generator) until the limit(inclusive) given.
"""
D = {}
q = 2
while q <= limit:
if q not in D:
yield q
D[q * 2] = [q]
else:
for p in D[q]:
D.setdefault(p + q, []).append(p)
del D[q]
q += 1
輸出,當我運行代碼:
2 1 [2]
5 2 [2, 3]
17 4 [2, 3, 5, 7]
41 6 [2, 3, 5, 7, 11, 13] # Longest sum of consecutive primes that adds to a prime below 100
197 12 [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37]
281 14 [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43]
的問題是它沒有找到素數953
這是在1000
以下加上素數的連續素數的最長總和。
於是,我改變了我的代碼來解決它做什麼時prm
在for
循環953
:
#!/usr/bin/python
import prime
p = prime.genprimes(1000)
prms = [i for i in p]
found = []
for prm in prms:
if prm == 953:
p = prm
for a in prms:
print p, '\t', a
p -= a
if p < -100:
break
輸出:
953 2
951 3
948 5
943 7
936 11
925 13
912 17
895 19
876 23
853 29
824 31
793 37
756 41
715 43
672 47
625 53
572 59
513 61
452 67
385 71
314 73
241 79
162 83
79 89
-10 97
任何想法,我做錯了這裏?謝謝你的幫助。
素953是從7至89 21米的素數的總和。 – 2014-09-06 02:26:14