如何在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
相关产品推荐
相关产品推荐

