Python求0到max间可被divisor整除的数的个数:代码优化咨询
更优实现方案分析
你的代码逻辑是正确的,但循环遍历每个数的方式在max数值很大时(比如百万级以上)效率会很低。下面提供几种更高效的替代方案:
数学计算方案(最优)
核心思路是用数学公式直接推导结果,时间复杂度为O(1),完全不需要遍历:
在0到max-1(对应你代码里range(max)的区间)范围内,能被divisor整除的数的个数等于 (max - 1) // divisor + 1。
(max - 1) // divisor得到小于max的最大倍数对应的商(比如max=10、divisor=3时,(10-1)//3=3,对应9=3*3)- 加1是因为要包含
0这个特殊值(0是任何非零数的倍数)
实现代码:
def divisible(max_num, divisor): if divisor == 0: raise ValueError("除数不能为0") return (max_num - 1) // divisor + 1 print(divisible(100, 10)) # 输出10 print(divisible(10, 3)) # 输出4 print(divisible(144, 17)) # 输出9
优化迭代方案
如果偏好迭代实现,可以利用range的步长特性,直接生成所有符合条件的数,避免逐个判断取模:
def divisible(max_num, divisor): if divisor == 0: raise ValueError("除数不能为0") # 从0开始,以divisor为步长生成所有小于max_num的数,直接取长度 return len(range(0, max_num, divisor)) print(divisible(100, 10)) # 输出10 print(divisible(10, 3)) # 输出4 print(divisible(144, 17)) # 输出9
这个方案的循环次数远少于原代码,且不需要执行取模运算,效率提升明显。
边界情况说明
不管用哪种方案,都建议加上除数为0的判断,避免触发ZeroDivisionError,让函数更健壮。
内容的提问来源于stack exchange,提问作者noah
相关产品推荐
相关产品推荐

