尽管遵循正确的定义,但n选择r代码的这2种变体得到了不同的答案
我看到此代码有效,
import math
def nCr(n,r):
f = math.factorial
return f(n) // f(r) // f(n-r)
但是我没有:
import math
def nCr(n,r):
f = math.factorial
return int(f(n) / (f(r) * f(n-r)))
使用测试用例nCr(80,20)
将显示结果差异。请告知为什么它们在Python 3中与众不同,谢谢!
无错误信息。正确的答案应该是3535316142212174320
,但是我的答案是3535316142212174336
。
答案 0 :(得分:0)
这是因为int(a / b)
与a // b
不同。
int(a / b)
首先评估a / b
,这是浮点除法。浮点数容易出现不准确,舍入错误等问题,例如.1 + .2 == 0.30000000000000004
。因此,在某些时候,您的代码会尝试对非常大的数进行除法,这会导致舍入错误,因为浮点数具有固定大小,因此无法无限精确。
a // b
是整数除,这是另一回事。 Python的整数 可以任意大,并且它们的除法不会引起舍入错误,因此您可以获得正确的结果。
谈到浮点数是固定大小的 。看看这个:
>>> import math
>>> f = math.factorial
>>> f(20) * f(80-20)
20244146256600469630315959326642192021057078172611285900283370710785170642770591744000000000000000000
>>> f(80) / _
3.5353161422121743e+18
数字3.5353161422121743e+18
的确切表示方式如下所示:3
中最后一个53...43
之后的数字没有信息,因为没有地方可以存储它。但是int(3.5353161422121743e+18)
必须在其中放一些东西!但是它没有足够的信息。因此,它将所需的内容放在float(int(3.5353161422121743e+18)) == 3.5353161422121743e+18
上。