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