我有这个数字,它是2个质数P和Q的乘积。示例
p=5
q=7
prod = int(p)*int(q)
#output: 35
还有另一组数字示例:
num = [5, 49, 10, 27]
我想从给定数字列表中找到乘积(P * Q)可能具有的子集数量,例如:
这些子集是(5,49),(5,49,10),(5,49,27),(5,49,10,27),(49,10),(49,10,27 )。有6个子集,输出为6。
答案 0 :(得分:0)
虽然可以改进此问题的措词,但据我了解,您正在尝试查找给定列表中包含prod因素的所有子集。这是我想出的代码:
from itertools import chain, combinations
from numpy import prod
def powerset(iterable):
"powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
s = list(iterable)
return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
def factor_subsets(a, factors):
return filter(lambda s: prod(s) % factors == 0 , a)
ps = powerset(set([5, 49, 10, 27]))
pq = 35
answer = factor_subsets(ps,pq)
print(answer)
print(len(answer))
输出:
[(49, 10), (49, 5), (49, 10, 27), (49, 10, 5), (49, 27, 5), (49, 10, 27, 5)]
6
答案 1 :(得分:-1)
由于已知最大子集与集合长度之间的关系,而您只需要数字而不是实际的配对,我们可以使其保持更快的速度。
我将您的输入列表转换为一个集合,以去除所有重复项。
num = [5, 49, 10, 27]
subsetnumber = 1 # Always includes itself
subsetsin = set(num)
subsetlength = len(subsetsin)
for i in range(2, subsetlength):
subsetnumber += subsetlength * (subsetlength-1) // i
print(subsetnumber)
这将返回11个2个或更多的唯一子集,对于1个或更多,只需将范围从“ 1”更改为“ 2”,
edit:谢谢下面的评论者,忘了算了。