【问题标题】:How to check if a sum of one pair of a factor is equal to the difference of another pair?如何检查一对因子的总和是否等于另一对因子的差?
【发布时间】:2022-01-10 20:19:02
【问题描述】:

我开发了一个函数,它可以找到任何给定数字的因数并将它们成对显示。我现在想检查是否至少有两对因子,其中一对的总和等于另一对的差。对是一个特定数字的因数。例如,数字 6 可以作为 2+3 = 6-1。我不确定如何在不导入的情况下启动代码。我已经包含了用于查找因子对的代码。

编辑:下面的用户提供了解决方案;但是,有没有一种方法可以让他的解决方案解决更多对而不是仅对 2 对?例如,数字 84 就是这些数字之一;但是,当它通过他的解决方案时,没有任何输出。

def Factors(value):
    factors = []
    for i in range(1, int(value**0.5)+1):
        if value % i == 0:
            factors.append((i, value // i))
    return factors

【问题讨论】:

  • @RiccardoBucco: 6*2 6.
  • 我主要关注直接达到6的两个因素。6和2等于12而不是6。
  • inefficient 方法是让嵌套循环遍历所有因子对对,以便您可以测试每个因子对的条件。更好的方法是构建一个字典,其键是数字,每个键的值是对的列表,其对总和为该值,对差异做同样的事情;我会让你从那里弄清楚。
  • 谢谢你,我将以此为基础!
  • @JunirOkoc 如果您在我的解决方案中输入 84(即,如果是 x == 84),那么您会得到 (3, 28) (4, 21),而不是像您说的那样。还有,Factors(84) == [(1, 84), (2, 42), (3, 28), (4, 21), (6, 14), (7, 12)]: 应该输出哪些对???

标签: python


【解决方案1】:

尝试使用itertools.combinations:

from itertools import combinations

x = # your number
for p1, p2 in combinations(Factors(x), 2):
    if sum(p1) == abs(p2[0] - p2[1]) or sum(p2) == abs(p1[0] - p1[1]):
        print(p1, p2)

这是一个实施来自@ScottHunter 的好建议的解决方案(其复杂度为 O(n)):

x = # this is your number, 6 for example
f = Factors(x)

dct = {}
for p in f:
    s = sum(p)
    if s in dct:
        dct[s].append(p)
    else:
        dct[s] = [p]

for p1 in f:
    d = abs(p1[0] - p1[1])
    if d in dct:
        print(*((p1, p2) for p2 in dct[d]))

这是如何工作的?首先,您构建一个字典,它将因子总和映射到总和为该值的对列表。例如这里f1 + f2 == f3 + f4 == k:

dct = {k: [(f1, f2), (f3, f4)]}

然后您迭代您的成对因素,找到它们的差异(使用d = abs(p[0] - p[1]))。现在,如果它们是一对(x1, x2),其差d 等于另一对(x3, x4) 的总和,那么肯定可以在dct[d] 中找到(x3, x4)

【讨论】:

  • 非常感谢!你能解释一下我们是如何访问 p1 和 p2 的吗?我对这部分也有点难过,我怎么能让它处理更复杂的数字,比如 100
  • @JunirOkoc 我用解释改进了答案
  • 抱歉打扰了。该代码仅适用于只有两对因子的数字;我该如何编辑它以使用更多对?
  • @JunirOkoc 你能告诉我一个例子,其中有一个数超过一对具有此属性的因子?
  • @RiccardoBucco:没有评论你的代码,而是回答你的问题,询问一个数字的例子,其中“不止一对具有这个的因素财产”。
【解决方案2】:

您可以将每一对相互比较。 itertools 模块中有一个方便的函数,它是 python 标准库的一部分。试试

import itertools as it
for (p1,p2),(q1,q2) in it.permutations(Factors(x),2):
    if p1+p2 == abs(q1-q2):
        print('{} + {} == |{} - {}|'.format(p1,p2,q1,q2)

【讨论】:

  • 您不必“必须将每一对相互比较”。
  • @ScottHunter 为什么我不必这样做?有一个关系,对于任何一对都可以是真的。要获得所有这些,您必须检查所有这些。问题没有明确说明,只寻找这样一对相关的因素。但即便如此,您也必须在最坏的情况下查看所有组合。如果我犯了错误,您能否更明确地指出或给出一个算法,该算法不会将每个点相互比较?
  • @ScottHunter 看看 Riccardo Bucco 提供的解决方案,您可能是对的。我会更正声明。
猜你喜欢
  • 1970-01-01
  • 2022-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多