反向阶乘乐趣不会超过170

时间:2019-05-26 09:17:11

标签: python python-3.x

我是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。 我的代码有解决方案吗? 或者,更可靠的代码可以逆向分解。

2 个答案:

答案 0 :(得分:4)

直接的问题是您正在使用浮点数学运算,并且浮点数学运算的范围有限:

>>> 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,同时确保余数始终保持为零。

我使用divmod同时计算商和每个除法步骤的余数。

答案 1 :(得分:0)

尽管@NPE的解决方案更干净,更高效,但是您可以使用原始代码进行一些小的更改以使其起作用:使用地板除法//,它返回整数,而不是常规除法{{1} }:

/