是什么让这段代码变得如此慢? (对于项目欧拉q45)

时间:2018-05-14 16:21:05

标签: python algorithm math

我刚刚解决并找到了项目euler问题45的答案,但解决方案需要20分钟来计算。其他类似的解决方案只需不到一秒的时间即可找到解决方案。

The problem

我的代码:

import time

def is_triangular(n):

    triangle_index = (((8 * n + 1) ** 0.5) + 1) / 2
    if triangle_index % 1 == 0:
        return True
    return False

def is_pentagonal(n):

    pentagonal_index = (((24 * n  + 1) ** 0.5) + 1) / 6
    if pentagonal_index % 1 == 0:
        return True
    return False

def is_hexagonal(n):
    hexagonal_index = (((8 * n + 1) ** 0.5) + 1) / 4
    if hexagonal_index % 1 == 0:
        return True
   return False


number = 40756
while True:
    if is_triangular(number) and is_pentagonal(number) and is_hexagonal(number):
        print(number)
        break

    number += 1

2 个答案:

答案 0 :(得分:5)

而不是检查每个数字并检查它的三角形,五边形和六边形。生成六边形数字,并为每个六边形数字检查其三角形或五边形。

您可以使用六边形数字的公式生成六边形数字,并将n增加1。

答案 1 :(得分:1)

因为您正在寻找40755之后的每个自然数。将案例限制为实数的一个子集:例如,如果您已经知道某个数字不是六边形,则可以将其丢弃。例如。

由于六角形属于密度较小的子集,因此首先要查看该集合中的数字。然后,检查它们是否是五边形,并最终检查它们是否也是三角形。

主要功能示例:

hex = 144
while True:
    number = hex*(2*hex-1)
    if is_hexagonal(number):
        if is_pentagonal(number):
            if is_triangular(number):
                print("Found: {}".format(number))
                break
    hex += 1

可以在Python代码中进行其他修改,但我只专注于算法。