给定一个由 1 到 1000 之间的数字组成的列表。需要确定所有数字加起来为 13 的数字(67、76、931 等)。如果给出一个数字(比如 1000),我知道如何实现这一点,但在列表的框架内并不清楚。尝试以下代码,但没有效果:
n=[i for i in range(1001)]
res=[0 for k in range(1001)]
for i in n:
while i:
a=i%10
i=i//10
res[k]+=a
if res[k] == 13:
print(i)
res只需将其设置为数字,而不是数组,并在每次迭代时将其重置为零。在每次迭代时,复制i到t,然后使用t,这样循环计数器就不会改变如果范围较大,那么您应该考虑优化 - 不要检查所有数字,而只是生成那些数字之和等于所需数字的数字
但这是一项伟大的任务!
对于小n来说,暴力破解和检查效果很好,但是您会注意到数字之和为 13 的数字很少。如果一个数字 中正好有k位数字,则不再有这样的数字C k+11 12,它只是数字总数9·10 k-1的(无限)小部分。如果是这样,那么您需要能够找到它们,而无需按顺序搜索所有数字。
我们将通过连续增加位深度k生成器来构造数字
search(k, s, n, d1)。数字本身是从高位到低位构建的。当添加数字时,s被更新- 数字之和的可用余数和n - 数字本身。生成器
search是无限的,依次导致ksearch(k, ...)增加。当下一个数字超过阈值时,该函数会停止它。main计算数字之和 - 十三:
作为另一种选择,可以使用内置 Python 函数以更短的方式解决此问题(但不太理想,因为处理字符串比处理数字慢):
或者甚至一行相同的代码:
或者另一句俏皮话: