You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python嵌套for循环输出无序?欧拉项目第4题代码疑问

为什么你的Python代码没先输出最大回文数?

嘿,这个问题我太能理解了!当初刚学Python循环的时候也踩过类似的坑,我来给你掰扯清楚~

问题出在遍历顺序和输出逻辑上

你写的Python代码是把所有符合条件的三位数乘积回文数都打印出来,而打印的顺序完全跟着双重循环的遍历走:

  • 先把x=999时,y从999一直降到101的所有乘积都检查一遍,碰到回文数就打印;
  • 然后轮到x=998,同样把y从999降到101的乘积全检查一遍,有回文数就打印;
  • 以此类推,直到x=101

而最大的回文数906609是993 × 913,这个组合要等到x=993的时候才会被遍历到。在这之前,x=999x=994的循环里,已经有其他回文数(比如580085=995×583)被找到并打印了,所以906609自然会出现在输出的后面。

为什么你觉得C语言代码会先输出最大数?

大概率是你的C语言代码逻辑和Python版本不一样!比如:

  • 可能C语言代码是找到一个回文数后就立刻终止循环(比如找到当前x对应的最大回文数就break,然后只保留最大的那个最后输出);
  • 或者C语言代码并没有打印所有回文数,而是只记录遍历过程中找到的最大值,最后只输出这个最大值。

而你的Python代码是毫无筛选地打印所有符合条件的结果,所以顺序完全是遍历的先后顺序,和数值大小无关。

怎么修改Python代码,让它优先找到最大回文数?

如果你的目标是找到最大的那个回文数,而不是打印所有,我们可以优化代码逻辑,避免无效遍历,同时直接定位到最大值:

def find_largest_palindrome():
    max_pal = 0
    # 外层循环从999递减到100
    for x in range(999, 100, -1):
        # 优化:如果当前x的平方都比已找到的最大值小,后面的x乘任何y都不可能更大,直接终止外层循环
        if x * x < max_pal:
            break
        # 内层循环从x开始,避免重复计算x*y和y*x(比如993×913和913×993是同一个数)
        for y in range(x, 100, -1):
            product = x * y
            # 如果当前乘积已经比最大值小,后面的y更小,乘积只会更小,直接终止内层循环
            if product < max_pal:
                break
            # 判断是否是回文数
            if str(product) == str(product)[::-1]:
                max_pal = product
                break  # 当前x对应的最大回文数就是这个,不用继续找更小的y了
    print(max_pal)

find_largest_palindrome()

这个优化后的代码会直接输出906609,而且遍历效率高很多,因为它避免了大量无效的计算和检查。

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

火山引擎 最新活动