You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Project Euler第45题求解代码运行缓慢的原因是什么?

优化Project Euler第45题的代码效率

嘿,我太懂这种“解出了题但跑不动”的憋屈感了!你当前的代码确实能得到正确答案,但暴力逐个检查数字的方式实在太低效了——咱们来把它优化到秒级,核心是找对遍历的对象,而不是瞎碰所有数字。

先搞懂关键数学规律

首先有个重要结论:所有六边形数都是三角数!不信你推导一下:
六边形数公式是 ( H_n = n(2n-1) ),而三角数公式是 ( T_k = k(k+1)/2 )。当 ( k=2n-1 ) 时,( T_{2n-1} = (2n-1)(2n)/2 = n(2n-1) = H_n )。所以你完全不用检查一个数是不是三角数,只要它是六边形数,天然就满足三角数的条件!这直接砍掉了三分之一的判断开销。

优化思路:只生成六边形数,再检查是否为五角数

原代码的问题是从40756开始逐个递增检查每个数,而符合条件的数极其稀疏,大部分数字都不符合,纯纯浪费时间。换个思路:直接生成六边形数(数量远少于所有自然数),然后只需要检查这个数是不是五角数就行。

优化后的代码

import time

def is_pentagonal(n):
    pentagonal_index = (((24 * n + 1) ** 0.5) + 1) / 6
    # 用is_integer()比%1==0更严谨,避免浮点数精度问题
    return pentagonal_index.is_integer()

start_time = time.time()
# 已知40756是第144个六边形数,从下一个开始找
n = 144
while True:
    n += 1
    hexagonal_num = n * (2 * n - 1)
    if is_pentagonal(hexagonal_num):
        print("找到的数:", hexagonal_num)
        break
print(f"运行耗时:{time.time() - start_time:.4f}秒")

为什么这版本快?

  • 去掉了冗余的is_triangular判断,少了一次计算
  • 不再遍历所有自然数,而是直接生成六边形数,每一个候选都是有意义的目标,迭代次数从几百万次直接降到几百次
  • 用is_integer()替代%1 == 0,避免浮点数精度带来的潜在问题(比如某些情况下计算出的索引可能是类似123.0000000001或者122.9999999999的情况)

运行这个代码,你会发现耗时绝对不到1秒,完美解决你的问题!

内容的提问来源于stack exchange,提问作者RedBanana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:42:12