问题描述
好的背景:我正在解决一个问题,该问题要求我找到一个数字“n”,使得 n-9、n-3、n+3、n+9 是连续的质数,而 n-8、n -4,n+4,n+8 是实际数字,然后我必须将满足此条件的前四个 n 相加。
问题:代码的逻辑正确与否在这里无关紧要,因为我的代码在达到1亿之前就崩溃了。我什至无法检查代码的输出,它适用于 100 万,但不适用于更大的数字。
我做了什么: 我使用了时代的筛子......得到了高达 1 亿的质数,我们称之为 M。由于实际数字可以被 6 或 4 整除,我创建了另一个集合来存储这些数字,然后从该列表中创建了一个包含满足此条件的数字的集合:“n-8、n-4、n+4、n+8 是实用数字”,我们将其称为 N。最后,我遍历 N 中的每个元素 a,然后检查 a - 9,a - 3,a + 3,a + 9 是否是质数集的一部分。
如果有人对我如何加快速度或任何更好的算法有任何建议,我们将不胜感激
代码
def SieveOfEratosthenes(n):
m = set()
prime = [True for i in range(n + 1)]
p = 2
while (p * p <= n):
if (prime[p] == True):
for i in range(p * 2,n + 1,p):
prime[i] = False
p += 1
prime[0]= False
prime[1]= False
for p in range(n + 1):
if prime[p]:
m.add(p)
return m
#creates set that stores multiples of 4 and 6
def ps1(n):
s = set()
for i in range(1,n+1):
if i%4 == 0 and i%6 == 0:
s.add(i)
return s
#checks whether any number satisfies n -8,n-4,n+8 must be practical and stores it in a set
def ps2(l):
q = set()
for i in l:
if ((i-8) in l) and ((i-4) in l) and ((i+4) in l) and ((i+8) in l):
q.add(i)
return q
#using the numbers stored in the prev set,i check the last condition n-9,n-3,n+3,n+9 must be in the
prime list
def TotalSieve(k,l):
q = set()
inc = 0
for i in k:
if inc != 4:
if ((i-9) in l) and ((i-3) in l) and ((i+3) in l) and ((i+9) in l):
inc = inc + 1
q.add(i)
else:
print("Found 4")
return q
# driver program
if __name__=='__main__':
n = 1000000000
m = SieveOfEratosthenes(n)
p = ps1(n)
p = ps2(p)
f = TotalSieve(p,m)
elem1 = f.pop()
elem2 = f.pop()
elem3 = f.pop()
elem4 = f.pop()
#add the first four numbers that satisfy the conditions
tot = elem1 + elem2 + elem3 + elem4
print(tot)
解决方法
首先,ps1
是错误的。测试应显示 or
,而不是 and
。
接下来,如果 n
可以被 4 整除,则所有 n-8,n-4,n+4,n+8
也可以被 4 整除。如果 n
不能被 4 整除,没有可以被 4 整除,一些也不能被 4 整除。这意味着您只对 n
是 4 的倍数感兴趣。 >
最后,我知道这个问题意味着一些严肃的数论作业。蛮力不行。