繁体   English   中英

如何优化我的代码以打印友好的数字?

[英]How can I optimize my code to print amicable numbers?

我已经尝试了以下代码,当我设置 lower = 0 和 upper = 10000 时需要很长时间

def sumPdivisors(n):
  '''This function returns the sum of proper divisors of a number'''
  lst = []
  for i in range(1,n//2+1):
    if n%i == 0:
      lst.append(i)
  return(sum(lst))

lower = int(input("Enter the lower value of range: "))
upper = int(input("Enter the upper value of range: "))

lst = []

for i in range(lower, upper+1):
    if i == 0:
      continue
    else:
      for j in range(i, upper):
        if i!=j and sumPdivisors(i) == j and sumPdivisors(j) == i:
          lst.append((i,j))
          break

print(lst)

您可以在这里做两件事。

记忆

这个网站[link]上的其他地方已经有一个很好的解释,但这里是它与您的问题的相关性:

  • sumPdivisors在代码片段底部的 for 循环中被非常频繁地调用。 对于非常大的输入n ,运行需要很长时间。

  • 使用相同的输入n多次调用sumPdivisors

  • 您可以通过以某种方式保存在不同输入上调用sumPdivisors的结果来加快速度,例如当您使用相应的 integer 调用sumPdivisors时,将整数映射到结果 output 的字典中。 这就是记忆化的一种。 您正在预先计算sumPdivisors的可能输出并将它们存储起来以备后用。 阅读链接以获得更深入的解释。

不要将 sumPdivisors 中的数字添加到列表中

您可以在迭代时添加这些数字,而不是将它们附加到列表中,然后将它们相加。 此更改不会像在您的代码中添加 memoization 那样产生很大的影响。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM