我已经用python写了几个月了,所以请不要对我太苛刻。但我已经写了这段代码,我不知道如何才能让它更快
n = 2
ListOfTriangles = []
ListOfDivisors = []
term = 0
for x in range(1,100001):
x = (n*(n-1))/2
ListOfTriangles.append(int(x))
n += 1
for y in range(1,100001):
Tri = ListOfTriangles[term]
for i in range(1,Tri+1):
if(Tri%i==0):
ListOfDivisors.append(i)
if len(ListOfDivisors) >= 500:
print("---------------------------------------------------")
print(len(ListOfDivisors))
print(ListOfDivisors)
print(ListOfTriangles[term])
print("---------------------------------------------------")
break
print(ListOfTriangles[term]," - ",len(ListOfDivisors)," - ",(term/100000)*(10**2),"%")
ListOfDivisors = []
term += 1
基本上,如果你不能从这个混乱中分辨出来,我所做的是,我创建了一个带有三角形数字的列表,然后将这个列表放入循环,列出列表中每个数字的所有因子,然后在找到满足500个因子以上数的要求的数字时停止
适用于此问题的一个想法如下:
n
的第三个三角形数t[n]
由n * (n + 1) / 2
给出。注意n
和n + 1
的唯一公约数是1
。设divs[n]
表示n
的除数。那么n
,我们有divs[t[n]] = divs[n//2] * divs[n+1] - 1
n
,我们有divs[t[n]] = divs[n] * divs[(n+1)/2] - 1
我们可以在
O(n^2)
时间内预先计算从1
到n
的每个数字的除数(这可以渐近改进),并使用上面的公式计算相应三角形数的除数。通过numpy
,我们有:相关问题 更多 >
编程相关推荐