python - 计算第一个三角形数在python中有超过500个除数

标签 python performance math

我正在尝试解决 Project Euler 的第 12 个问题。我可以在将近 4 分钟内计算出除数超过 500 的数字。我怎样才能让它更快?这是尝试;

import time

def main():
    memo={0:0,1:1}
    i=2
    n=200
    while(1):
        if len(getD(getT(i)))>n:
            break
        i+=1
    print(getT(i))

#returns the nth triangle number
def getT(n):
    if not n in memo:
        memo[n]=n+getT(n-1)
    return memo[n]

#returns the list of the divisors
def getD(n):
    divisors=[n]
    for i in xrange(1,int((n/2)+1)):
        if (n/float(i))%1==0:
            divisors.append(i)
    return divisors

startTime=time.time()
main()
print(time.time()-startTime)

最佳答案

您不需要数组来存储三角形数。您可以使用单个 int,因为您只检查一个值。此外,使用三角形编号公式可能会有所帮助:n*(n+1)/2 您可以在其中找到第 n 个三角形编号。

getD 也只需要返回一个数字,因为您只是在寻找 500 个除数,而不是除数的值。

但是,您真正的问题在于for 循环中的n/2。通过检查因子对,您可以使用 sqrt(n)。所以只检查小于等于 sqrt(n) 的值。如果检查到 n/2,您会得到大量浪费的测试(数百万)。

所以你要执行以下操作(n 是要查找除数的整数,d 是可能的除数):

  • 确保n/d没有余数。
  • 确定是将 1 还是 2 添加到除数中。

关于python - 计算第一个三角形数在python中有超过500个除数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15735028/

相关文章:

python - WT 表格 : how do I set a default value for an HTML5 Widget?

python - PIL.Image.open() 给出 IOError : cannot identify image file

python - 在 python 中将列表转换为 HTML 表格的最简单方法?

mysql - 是否可以在不采取任何读取锁定的情况下在 mysql 中发出选择查询?

python - Groupby 并查找 Pandas DataFrame 中每组前 10% 的记录

java - 我们能否将延迟和吞吐量与并行性联系起来

Oracle选择匹配连接条件的随机行

math - 全局变换到局部变换?

c - 欧拉 160 : Find the non trivial 5 digits of the factorial

python - 如何向用户输出力量?