如何在Python

时间:2016-05-17 03:21:49

标签: python

所以我必须制作一个生成第一个三角形数的代码,该数字超过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秒内完成?

1 个答案:

答案 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)