我刚刚解决并找到了项目euler问题45的答案,但解决方案需要20分钟来计算。其他类似的解决方案只需不到一秒的时间即可找到解决方案。
我的代码:
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
答案 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代码中进行其他修改,但我只专注于算法。