一种简单的递归方法:
def get_equations(n):
equations = set()
quotient, remainder = divmod(n ** 0.5, 1)
for divisor in range(n - 1, int(quotient if remainder else quotient - 1), -1):
quotient, remainder = divmod(n, divisor)
if remainder == 0:
equations.add(tuple(sorted([divisor, quotient])))
for sub_equation in get_equations(divisor):
equations.add(tuple(sorted([*sub_equation, quotient])))
return equations
print(get_equations(12))
print(get_equations(25))
print(get_equations(81))
输出
> python3 test.py
{(2, 2, 3), (2, 6), (3, 4)}
{(5, 5)}
{(3, 3, 9), (3, 3, 3, 3), (3, 27), (9, 9)}
>
我没有像引用副本中的所有建议那样明确地首先关注质数除数,而是让它全部发挥作用。不是最佳的(应该避免重复而不是使用集合来消除它)但足够简单,并且不需要数天的研究。
我没有包含您的“12 = 12”结果,因为它实际上是“12 = 12 * 1”并且您说“与 1 不同”。