我有一个大范围的数字(从10^5到10^6),我需要计算所有的数字,这些数字的总和等于乘积。在
例如,111126
我试过使用下面的代码,它工作得很好,但是非常慢,因为数字范围很大。在
result = 0
for num in range(x, y):
num_str = str(num)
summation = 0
product = 1
for j in range(len(num_str)):
summation += int(num_str[j])
product *= int(num_str[j])
if j == len(num_str) - 1:
if summation == product:
result += 1
print(result)
有没有办法不用循环数数这些数字?如果没有,如何让它跑得更快?在
你根本不需要强行这么做,因为你可以大大限制你的搜索。在
1 + 2
的和与2 + 1
相同,同样适用于它们的乘积。在最好将注意力集中在具有相等或递增位数的数字上,如果这些数字和乘积的值相同,则对这些数字进行所有唯一的排列。在
要生成候选编号,只有1287个排列,替换范围为1到9的5位数字:
搜索空间要小得多:
^{pr2}$这在很短的时间内就产生了40个结果:
搜索范围可能会进一步缩小;例如,使用更多的mathematical observations可以缩小对那些至少有2
1
位数的数字的搜索,但是上面的搜索已经相当快了。在加速循环的常用方法是将其更改为numpy数组,并执行数组操作而不是循环。所以,如果你把你的数字输入一个2D numpy数组,然后做一个数组操作,比如a==B,然后在新数组中计算真值,通常会快得多。在
也许还有比暴力更好的方法。我不清楚您的范围,因为您给出的示例超出了您给出的范围,但是您可以看到最大和是5x9=45。你可以立即删除所有素数大于10的素数。在
例如,您可以遍历5个数的所有可能乘积,例如1<;=b<;=c<;=d<;=9和abed<;=45。当你找到一个解决方案时,只需计算出你找到的另一个类似的解决方案的数量。在
相关问题 更多 >
编程相关推荐