如何优化Python脚本求解欧拉计划第4题:两数乘积最大回文数
Project Euler第4题(最大回文乘积)优化方案
原有代码存在的问题
- 第一个版本问题:
- 遍历范围有误:计算两位数乘积用了
range(1,100),如果要算三位数乘积应该调整为range(100, 1000) - 最大回文判断逻辑完全错误:
if max(str(i) and max(str(i2)))这行没有任何实际判断作用,既不能筛选大因子,也不能筛选大乘积 - 每找到一个回文就打印,导致需要滚动到最后才能找到最大值,效率极低
- 遍历范围有误:计算两位数乘积用了
- 你更新后的版本问题:
- 硬编码了
i > 900 and i2 > 900的判断,属于针对本题的巧合适配,不具备通用性,换其他类似题目就会失效 - 用
while+break的逻辑完全多余,等价于普通的if判断 - 仍然会打印所有符合范围的回文乘积,没有做最大值筛选,遍历顺序还是从小到大,效率没有本质提升
- 硬编码了
修复后的基础实现
核心思路是新增一个变量存储当前找到的最大回文数,每次找到新的回文数就和当前最大值比较,更大的才更新,遍历结束后统一输出结果:
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}")
更高效的优化实现
核心优化点:
- 从大到小遍历因子,一旦当前因子的乘积已经小于现有最大回文,直接终止内层循环,不用继续遍历更小的因子
- 避免重复计算:比如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
相关产品推荐
相关产品推荐

