三位数字乘积构成的最大回文数:我的Python代码存在什么问题?
排查你的三位数字乘积最大回文数代码问题
让我们一步步拆解你的代码问题,看看为什么它没有输出正确的结果:
核心错误点
- 死循环陷阱:你外层的
while True没有任何终止条件,程序会反复执行嵌套的for循环,永远不会自动停止。你看到的580085只是你手动终止程序前,p变量最后一次被更新的值,完全不是全局最大的回文数。 - break作用范围错误:当找到一个回文数时,
break仅终止了内层的k循环,i会继续递增到下一个数。但这样你只是找到了每个i对应的最小k能组成的回文数,而不是每个i能生成的最大回文数,更不用说在所有可能的乘积里筛选全局最大值了。 - 未保留最大值:你的代码每次找到回文数就直接把
p替换成当前的f,哪怕这个f比之前的p更小。比如先找到一个较大的回文数后,后面遇到更小的回文数时,p会被覆盖成更小的值,这完全违背了找最大值的目标。
修正思路与代码
我们可以调整遍历顺序、优化循环逻辑,同时保留最大值判断,来得到正确结果:
def is_palindrome(n): return str(n) == str(n)[::-1] max_palindrome = 0 # 从大到小遍历三位数,优先计算大乘积,更快锁定最大值 for i in range(999, 99, -1): # 让k从i开始往下遍历,避免重复计算(比如999*998和998*999是同一个乘积) for k in range(i, 99, -1): product = i * k # 如果当前乘积已经小于记录的最大值,没必要继续找更小的k了 if product <= max_palindrome: break if is_palindrome(product): max_palindrome = product break # k从大到小,第一个回文数就是当前i能得到的最大乘积 print(max_palindrome)
修正后的逻辑说明
- 函数名改为更直观的
is_palindrome,直接返回布尔判断结果,代码更简洁清晰。 - 从999往100倒序遍历,优先计算大数值的乘积,能更快找到候选的最大回文数。
- 内层循环中,当乘积已经小于当前记录的最大值时,直接终止循环——因为更小的k只会生成更小的乘积,不可能超过当前最大值。
- 每个
i找到第一个回文数就终止内层循环,因为k是从大到小遍历的,这个回文数就是当前i能生成的最大回文乘积。
内容的提问来源于stack exchange,提问作者Sarthak Jha
相关产品推荐
相关产品推荐

