代码之家  ›  专栏  ›  技术社区  ›  05bs001

Euler 12需要优化

  •  2
  • 05bs001  · 技术社区  · 6 年前

    我已经解决了 euler problem 12 ,但它需要一些优化。我在euler论坛上读过,但它并没有帮助我优化它。然而,我已经设法找到了解决方案,我只需要加快速度。目前运行需要4分钟。这是我的代码:

    import time
    
    def nthtriangle(n):
        return (n * (n + 1)) / 2
    
    def numberofnfactors(n):
        count = 0
        if n==1:
            return 1
        for i in range(1, 1 + int(n ** 0.5)):
            if n % i == 0:
                count += 2
        return count
    
    
    def FirstTriangleNumberWithoverxdivisors(divisors):
        found = False
        counter = 1
        while not found:
            print(int(nthtriangle(counter)), "                   ", numberofnfactors(nthtriangle(counter)))
            if numberofnfactors(nthtriangle(counter)) > divisors:
                print(" first triangle with over ",divisors, " divisors is ", int(nthtriangle(counter)))
                found = True
                break
            counter += 1
    
    start_time = time.time()
    FirstTriangleNumberWithoverxdivisors(500)
    print("My program took", time.time() - start_time, "to run")   
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Patrick Haugh    6 年前

    使用生成器获取三角形编号,而不是单独计算每个三角形编号

    from timeit import timeit
    
    def triangle_numbers():
        count = 1
        num = 0
        while True:
            num += count
            count += 1
            yield num
    
    def count_divisors(n):
        count = 0
        if n==1:
            return 1
        for i in range(1, 1 + int(n ** 0.5)):
            if n % i == 0:
                count += 2
        return count
    
    print(timeit('next(num for num in triangle_numbers() if count_divisors(num) >= 500)', 
                 globals=globals(), number=1))
    

    给了我 3.8404819999996107 (秒)在我的机器上。您可能还可以改进除数计数。

    真正让你慢下来的是打电话 nthtriangle numberoffactors 在你的循环中不止一次!另外,这些电话 print 不是免费的。

    推荐文章