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

如何优化Python脚本求解欧拉计划第4题:两数乘积最大回文数

Project Euler第4题(最大回文乘积)优化方案

原有代码存在的问题

  • 第一个版本问题:
    1. 遍历范围有误:计算两位数乘积用了range(1,100),如果要算三位数乘积应该调整为range(100, 1000)
    2. 最大回文判断逻辑完全错误:if max(str(i) and max(str(i2)))这行没有任何实际判断作用,既不能筛选大因子,也不能筛选大乘积
    3. 每找到一个回文就打印,导致需要滚动到最后才能找到最大值,效率极低
  • 你更新后的版本问题:
    1. 硬编码了i > 900 and i2 > 900的判断,属于针对本题的巧合适配,不具备通用性,换其他类似题目就会失效
    2. 用while+break的逻辑完全多余,等价于普通的if判断
    3. 仍然会打印所有符合范围的回文乘积,没有做最大值筛选,遍历顺序还是从小到大,效率没有本质提升

修复后的基础实现

核心思路是新增一个变量存储当前找到的最大回文数,每次找到新的回文数就和当前最大值比较,更大的才更新,遍历结束后统一输出结果:

def max_palindrome(min_factor, max_factor):
    max_pali = 0
    result_a = result_b = 0
    for i in range(min_factor, max_factor):
        for j in range(min_factor, max_factor):
            product = i * j
            # 判断是否是回文
            if str(product) == str(product)[::-1]:
                # 比当前最大值大才更新
                if product > max_pali:
                    max_pali = product
                    result_a = i
                    result_b = j
    return max_pali, result_a, result_b

# 计算三位数的最大回文乘积
max_p, a, b = max_palindrome(100, 1000)
print(f"因子1: {a:>5}")
print(f"因子2: {b:>5}")
print(f"乘积 = {max_p:>7}")

更高效的优化实现

核心优化点:

  1. 从大到小遍历因子,一旦当前因子的乘积已经小于现有最大回文,直接终止内层循环,不用继续遍历更小的因子
  2. 避免重复计算:比如999998和998999是同一个结果,所以内层循环可以从当前外层因子的大小开始遍历,减少一半计算量
def max_palindrome_optimized(min_factor, max_factor):
    max_pali = 0
    result_a = result_b = 0
    # 从大到小遍历外层因子
    for i in range(max_factor-1, min_factor-1, -1):
        # 如果当前i乘最大的可能j都比已找到的最大值小,直接终止所有循环
        if i * (max_factor-1) < max_pali:
            break
        # 内层循环从i开始,避免重复计算
        for j in range(i, min_factor-1, -1):
            product = i * j
            if product < max_pali:
                # 后面的j更小,乘积只会更小,直接跳出内层循环
                break
            if str(product) == str(product)[::-1]:
                max_pali = product
                result_a = i
                result_b = j
    return max_pali, result_a, result_b

max_p, a, b = max_palindrome_optimized(100, 1000)
print(f"因子1: {a:>5}")
print(f"因子2: {b:>5}")
print(f"乘积 = {max_p:>7}")

这个优化版本比基础版本快数倍,计算三位数的最大回文乘积几乎瞬间就能出结果,不需要遍历所有组合。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 12:06:04