所以我必须制作一个生成第一个三角形数的代码,该数字超过500个因子。下面详细说明了这个问题:
通过添加自然数来生成三角数的序列。所以第7个三角形数字是1 + 2 + 3 + 4 + 5 + 6 + 7 = 28.前十个术语是:
1,3,6,10,15,21,28,36,45,55,......
让我们列出前七个三角形数字的因子:
1:1 3:1,3 6:1,2,3,6 10:1,2,5,10 15:1,3,5,15 21:1,3,7,21 28:1,2,4,7,14,28 我们可以看到28是第一个超过五个除数的三角形数。
第一个三角形数的值超过500个除数是多少?
我编写了一段生成相同代码的代码,但它非常效率低;请提出一些改进方法。此外它效率很低,只适用于70以下的数字
我的代码如下,请参阅:
def generates_triangle_numbers_upto_n(n):
list = [1]
while len(list)<n:
nth = int(len(list)+1)
to_be_appended = nth/2 + nth**2/2
list.append(to_be_appended)
return list
def return_number_of_n(n):
num = 0
for i in range(2, int(n)):
if n%i == 0:
num = num+1
return num + 2
def main(n):
list = generates_triangle_numbers_upto_n(20000)
for i in list:
if return_number_of_n(i) > int(n):
return i
print(main(100))
我在这个网站上看到了similar个问题,但我不明白它是如何运作的:
非常感谢!
编辑1: 感谢大家提供的精彩建议,我根据这些建议改进了我的代码:
def main(n):
list = [1]
while return_number_of_n_second(list[len(list)-1]) <= n:
nth = int(len(list)+1)
to_be_appended = int(nth/2 + nth**2/2)
list.append(to_be_appended)
return list[len(list)-1]
def return_number_of_n_second(n):
num = 0
import math
sqrt = math.sqrt(n)
for i in range(2, math.ceil(math.sqrt(n))):
if n%i == 0:
num = num+1
if int(sqrt) == sqrt:
return num*2 +3
return num*2 + 2
print(main(500))
但是,现在也需要10-15秒才能执行。有没有办法让它更高效,因为几乎所有项目euler的问题都要在2-3秒内完成?
答案 0 :(得分:0)
只需进行一些基本的技术优化,它应该这样做:
import time
import math
def main(n):
last, length = 1, 1
while return_number_of_n_second(last) <= n:
length += 1
last = int(length/2 * (length+1))
return last
def return_number_of_n_second(n):
sqrt = math.sqrt(n)
if int(sqrt) == sqrt:
return 2
return sum(1 for i in range(2, math.ceil(sqrt)) if not n % i) * 2 + 2
start_time = time.time()
print(main(500))
print(time.time() - start_time)