【问题标题】:How can I print out all the results?如何打印所有结果?
【发布时间】:2021-12-13 00:23:39
【问题描述】:

这里的问题是获得相当大的数字 17309205 的所有 4 对因子。 结果应该是

{1,1,1,17309205}
{1,1,3,5769735} etc..

我尝试了 4 个嵌套的 for 循环,但耗时太长,所以我尝试了不同的想法。

我的想法是找到所有可能的因子对,然后将其过滤掉那些包含 4 对的因子。但现在我只得到一个结果。 而且结果也没有按照应有的方式打印。

def s(target, numbers,memo={}):
    if target == 0:
        return 0
    if target == 1:
        return 1
    if target < 0:
        pass
    if target in memo:
        return memo[target]
    result = []    
    for n in numbers:
        if target%n !=0:
            pass
        else:
            dominator = target/n
            result = s(dominator, numbers, memo)
            memo[target] = [result,[n,dominator]]
            return memo[target]

v = list(range(2,17309205))
print(s(17309205,v))

【问题讨论】:

  • 欢迎来到 SO!恐怕我不了解该功能的规范。你能澄清一下吗?也许在较小的输入上显示逻辑会使它更清晰。谢谢。
  • 例如。 4 的 4 对因子是 {1, 1, 1,4} 和 {1, 1, 2, 2}。
  • {2,2,2,2,2} 是 32 的因数之一,但它不应包含在结果中,因为它包含 5 个元素。

标签: python python-3.x recursion memoization


【解决方案1】:

我看到了一个可能的解决方案。首先,您必须计算该数字的所有质因数。

为此,您需要创建一个按顺序产生素数的函数。

该函数应该将素数存储在一个列表中,并测试下一个未测试的数字是否可以被列表中的任何素数整除。如果该数不能被列表中的任何素数整除,则该数是素数。

例如,当您有素数列表 [2,3,5,7] 测试 8 可被 2,3,5 和 7 整除时。它可以被 2 整除,因此它不是素数,然后选择 9,等等......当达到 11 时,它是素数,所以把它放在列表中并产生 11。

一旦计算出您给出的数字的所有因子质数,您必须将每个因子分配到列表中的 4 个位置之一。然后通过将位置中的数字乘以因子来将所有因子“放入”其对应的位置。你从 [1,1,1,1] 开始。

要获得所有 4 对因子,您需要所有可能的因子分配。即[0,1,2,3]与自身N次的集合积,其中N为因子个数。

(N个因子有多少对?)

例如,如果有 5 个因子,则集合乘积的元素是 [1, 0, 2, 3, 3] 将第一个因子分配给位置 1,第二个因子分配给位置 0,第三个因子分配给位置 2 和第四个第五个因素放置 3。

对于我们使用itertools.product的集合产品:

import itertools
assignments = itertools.product([0,1,2,3], repeat = len(factors))


for a in assignments:
    pair = [1,1,1,1]
    for i, place in enumerate(a):
        pair[place] *= factor[i]
    pairs.append(pair)

【讨论】:

  • 我试过这个 itertools.product 方法。结果格式与我的预期相符,但结果却不尽如人意。例如。 16的所有因子都是(1,2,4,8,16),4对因子应该是(1,1,1,16)(1,1,2,8)(1,1,4,4)( 1,2,2,4)。但是 itertools.product 的结果包括 (1024,1,1,1) 因为它乘以所有可能的 16 因子。
【解决方案2】:

我可以用下面的代码得到想要的结果,但是如果目标太大,问题就会太慢。

target = 16
for a in range(1,target+1):
    for b in range(1,target+1):
        for c in range(1, target+1):
            for d in range(1, target+1):
                if a<=b<=c<=d and a*b*c*d == target:
                    print (a,b,c,d)

【讨论】:

    猜你喜欢
    • 2013-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-25
    相关资源
    最近更新 更多