<p>对不起,我不明白你代码背后的逻辑。你知道吗</p>
<p>我不明白为什么每次通过<code>while True</code>循环用相同的<code>brownNum</code>值计算<code>math.factorial(brownNum)</code>4次。在<code>for</code>循环中:</p>
<pre><code>for i in range(math.factorial(brownNum)+1,math.factorial(brownNum)+2):
</code></pre>
<p><code>i</code>将<em>仅</em>具有<code>math.factorial(brownNum)+1</code>的值</p>
<p>总之,这里是我的python3代码,用于对<a href="https://en.wikipedia.org/wiki/Brocard%27s_problem#Brown_numbers" rel="nofollow noreferrer">Brown numbers</a>进行暴力搜索。它会很快找到仅有的3对已知数字,然后在这台2GHz 32位机器上,在大约1.8秒内测试1000以下的所有其他数字。在这一点之后,你可以看到它在减速(它在20秒左右达到2000),但它会很高兴地前进,直到阶乘变得太大,你的机器无法容纳。你知道吗</p>
<p>我将进度信息打印到stderr,这样它就可以从Brown\u数字对输出中分离出来。另外,当您不打印换行符时,stderr不需要刷新,这与stdout不同(至少在Linux上不需要)。你知道吗</p>
<pre><code>import sys
# Calculate the integer square root of `m` using Newton's method.
# Returns r: r**2 <= m < (r+1)**2
def int_sqrt(m):
if m <= 0:
return 0
n = m << 2
r = n >> (n.bit_length() // 2)
while True:
d = (n // r - r) >> 1
r += d
if -1 <= d <= 1:
break
return r >> 1
# Search for Browns numbers
fac = i = 1
while True:
if i % 100 == 0:
print('\r', i, file=sys.stderr, end='')
fac *= i
n = fac + 1
r = int_sqrt(n)
if r*r == n:
print('\nFound', i, r)
i += 1
</code></pre>