擅长:python、mysql、java
<p>只要你的数字<code>n</code>相当小(小于大约1500),我想最快的方法就是尝试所有可能的值。您可以使用<code>numpy</code>快速完成此操作:</p>
<pre><code>import numpy as np
import scipy.misc as misc
nMax = 1000
a = 77
b = 100
n = np.arange(1, nMax+1, dtype=np.float64)
val = misc.comb(n, a)/n**b
print("Maximized for n={:d}".format(int(n[val.argmax()]+0.5)))
# Maximized for n=181
</code></pre>
<p>这并不是特别优雅,但对于<code>n</code>的范围来说相当快。问题是<code>n>1484</code>的分子可能已经太大而无法存储在<code>float</code>中。然后,此方法将失败,因为您将遇到溢出。但这不仅仅是<code>numpy.ndarray</code>不能处理<code>python</code>整数的问题。即使使用它们,您也无法计算:</p>
^{pr2}$
<p>因为您希望得到一个浮点结果,使两个数的除法大于python中a <code>float</code>在我的系统上可以容纳(<code>max_10_exp = 1024</code>)的最大值。请参见<code>sys.float_info()</code>)。在这种情况下,你也不能使用你的<code>range</code>。如果你真的想做那样的事情,你就必须在数字上更加小心。在</p>