<p>你根本不需要强行这么做,因为你可以大大限制你的搜索。在</p>
<ul>
<li>任何带有0的数字都将导致乘积为0,而总和将大于等于0。忽略这些数字。</li>
<li>顺序无关紧要。<code>1 + 2</code>的和与<code>2 + 1</code>相同,同样适用于它们的乘积。在</li>
</ul>
<p>最好将注意力集中在具有相等或递增位数的数字上,如果这些数字和乘积的值相同,则对这些数字进行所有唯一的排列。在</p>
<p>要生成候选编号,只有1287个排列,替换范围为1到9的5位数字:</p>
<pre><code>>>> import itertools
>>> len(list(itertools.combinations_with_replacement(range(1, 10), 5)))
1287
</code></pre>
<p>搜索空间要小得多:</p>
^{pr2}$
<p>这在很短的时间内就产生了40个结果:</p>
<pre><code>>>> from itertools import combinations_with_replacement, permutations
>>> from operator import mul
>>> from functools import reduce
>>> results = set()
>>> for digits in combinations_with_replacement(range(1, 10), 5):
... if sum(digits) == reduce(mul, digits):
... results.update(int(''.join(map(str, p))) for p in permutations(digits))
...
>>> len(results)
40
>>> for result in sorted(results):
... print(result)
...
11125
11133
11152
11215
11222
11251
11313
11331
11512
11521
12115
12122
12151
12212
12221
12511
13113
13131
13311
15112
15121
15211
21115
21122
21151
21212
21221
21511
22112
22121
22211
25111
31113
31131
31311
33111
51112
51121
51211
52111
</code></pre>
<p>搜索范围可能会进一步缩小;例如,使用更多的<a href="https://math.stackexchange.com/questions/227515/the-product-of-digits-equal-to-the-sum-of-digits">mathematical observations</a>可以缩小对那些至少有2<code>1</code>位数的数字的搜索,但是上面的搜索已经相当快了。在</p>