反向阶乘乐趣不会超过170

2024-06-16 14:32:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我是pyhon的初学者,我正在尝试反转阶乘函数。 5的阶乘是120 我想让我的代码输入120,然后返回5 这是我现在的密码:

`from math import factorial
    def rf(f):
        d=2
        while f/factorial(d) != 1:
            if f/factorial(d) <= 1:
                 print("Entered number is not a factorial")
                 return
            d += 1
        return int(d)`

它可以将阶乘反转到170。但是当我输入171的阶乘时,代码进入OverFlowError。 我的代码有解决方案吗? 或者,一个更可靠的代码来反转阶乘。你知道吗


Tags: 函数代码fromimport密码returnifdef
2条回答

尽管@NPE的解决方案更简洁、更高效,但您可以使用原始代码,只需做一点小小的修改即可:使用返回整数的floor division//,而不是普通的division/

from math import factorial

def rf(f):
    d=2
    while f//factorial(d) != 1:
        if f//factorial(d) <= 1:
            print("Entered number is not a factorial")
            return
        d += 1
    return int(d)

rf(factorial(171))
# 171

当前的问题是,您使用的是浮点数学,而浮点数学的范围有限:

>>> sys.float_info.max
1.7976931348623157e+308

170!比这个小,但是171!比这个大。)

如果您坚持整数数学,您将避开这个问题,因为Python整数只受可用内存量的限制,因此可以变得更大。你知道吗

同样值得注意的是,反复调用factorial()是非常昂贵的。你知道吗

如果是我,我会这样做:

def rf(f):
  n = 2
  while True:
    f, r = divmod(f, n)
    if r != 0:
      return None  # input isn't a factorial
    if f == 1:
      return n
    n += 1

print(rf(6))
print(rf(42))
print(rf(200896062499134299656951336898466838917540340798867777940435335160044860953395980941180138112097309735631594101037399609671032132186331495273609598531966730972945653558819806475064353856858157445040809209560358463319644664891114256430017824141796753818192338642302693327818731986039603200000000000000000000000000000000000000000000))

这将输入除以2然后3然后4等,直到结果为1,同时确保余数始终保持零。你知道吗

我用^{}同时计算商和每个除法步骤的余数。你知道吗

相关问题 更多 >