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

如何在Python的if语句中嵌入循环优化Project Euler第5题求解代码

优化你的Project Euler问题25解决方案:用循环替代重复取余判断

嘿,这个问题提得很棒!你现在写的一堆start%2==0 and start%3==0...确实太冗余了,用循环来替代不仅能让代码更简洁,还能让它更灵活(比如以后要改成1到30的话,直接调整循环范围就行)。

基础循环替代方案

我们可以用一个for循环遍历2到20的所有整数,逐个检查是否能整除start,只要有一个数不能整除,就标记为不满足条件并跳出循环;如果所有数都能整除,就返回这个start。修改后的代码如下:

def smallest_m():
    start = 1
    while True:
        is_divisible = True
        # 遍历2到20的所有数
        for num in range(2, 21):
            if start % num != 0:
                is_divisible = False
                break  # 只要有一个数不能整除,就不用继续检查了
        if is_divisible:
            return start
        start += 1

更Pythonic的优化:用all()函数

如果你想让代码更简洁,可以用Python内置的all()函数,它会检查可迭代对象里的所有元素是否都为True,这样一行就能代替循环和判断:

def smallest_m():
    start = 1
    while True:
        # 检查是否能被2到20的所有数整除
        if all(start % num == 0 for num in range(2, 21)):
            return start
        start += 1

进一步优化:减少不必要的检查

其实我们不用检查1到20的所有数,因为最小公倍数(LCM)的核心是取每个质因数的最高次幂。比如:

  • 能被16(2⁴)整除的数,肯定能被2、4、8整除
  • 能被9(3²)整除的数,肯定能被3、6整除
  • 剩下的只需要检查质数:5、7、11、13、17、19

所以我们可以只检查这些关键数,大幅减少循环次数,让代码运行更快:

def smallest_m_optimized():
    start = 1
    # 只需要检查这些质因数的最高次幂
    key_numbers = [16, 9, 5, 7, 11, 13, 17, 19]
    while True:
        if all(start % num == 0 for num in key_numbers):
            return start
        start += 1

这个优化后的版本会比原始的逐一判断快很多,因为需要检查的数从19个降到了8个,而且逻辑更贴合问题的数学本质(求最小公倍数)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:23:18