我正在尝试解决这个问题(来自Project Euler)。
素数3,7,109和673非常值得注意。通过采取任何两个 以任何顺序连接和连接它们,结果将始终如一 主要。例如,取7和109,7109和1097都是素数。 这四个素数的总和,792,代表一组的最低总和 这个属性的四个素数。
找到任意两个素数的五个素数的最小和 连接以产生另一个素数。
对于复制场景,考虑到4个素数(3,7,109,673)的事实
我用Sera of Erathosenes生成素数直到700000并将其存储在一个列表中。
导出素数至700,并将其存储在另一个列表中。
现在,
l = [3,5,7,11 ...] -- till 700
primes = [3,5,.....] - till 700000
现在,我通过添加前缀和后缀,将列表中的每个数字与其他素数进行比较。
Take,3并将其与5进行比较。 35和53不是素数。然后与7比较。 37和73是素数。因此将7插入列表。
3的循环结束,插入到字典中,其中3为键,列表中的3与列表中的3属性匹配为Value。我还将键值添加到列表中。
因此,我最终得到了像这样的字典
key : 3 , Value : 3, 7, 11, ..., 109 , ... 673
key : 7 , Value : 3, 7, 11, .., 109, 673
key : 11, Value : ......
..
..
..
key 673 , Value : 3,7, .. 109, 673
现在,我有123个列表,其中只有4个列表有3,7,109和673.
如何检索这些列表中的公共号码?
我不知道如何比较匹配元素的4个列表。
但是,如果有一些方法可以导出4个列表中常见的4个数字,那么我就解决了Project Euler问题。我可以通过增加上限为5个数字应用相同的逻辑。
我目前的代码:
def eratosthenes2(n):
multiples = set()
for i in range(2, n+1):
if i not in multiples:
yield i
multiples.update(range(i*i, n+1, i))
primes = list(eratosthenes2(700000))
def isReversedPrime(m,n):
if( int( str(m) + str(n) ) in primes and int( str(n) + str(m) ) in primes ):
return True
else:
return False
f1 = open('logs.txt', 'w+')
toCheck = list(eratosthenes2(700))
#toCheck = [ i for i in range(2,700)]
d = {}
print "Total Elements " , len(toCheck)
for i in range(len(toCheck)):
print "Checking for ", toCheck[i], " iteration ", i
l = []
for j in range(len(toCheck)):
if isReversedPrime(toCheck[i], toCheck[j]) == True :
l.append(toCheck[j])
#print toCheck[i] , " has " , len(l), " elements "
if len(l) > 0:
d[toCheck[i]] = l
#print "\n"
答案 0 :(得分:2)
您可以使用set.intersection
查找常用元素。
>>> list1 = set([1,2,3,4])
>>> list2 = set([2,3,4,5])
>>> list3 = set([3,4,5,6])
>>> lists = [list1, list2, list3]
>>> set.intersection(*lists)
set([3,4])