Python编程练习:求20个输入数中约数最多的数(同数取大)代码问题
问题分析与代码修正:约数个数最多的整数筛选问题
问题场景
输入20个整数,找出其中约数个数最多的数,输出该数及其约数个数;若多个数约数个数相同,需输出数值较大的数。示例输入中正确输出应为594 16,但现有代码输出570 16,需排查并修正问题。
代码错误分析
你的代码存在两个核心问题:
- 条件判断逻辑位置错误:处理「约数个数相同但数值更大」的判断被嵌套在「约数个数大于当前最大值」的条件块内,导致该逻辑永远无法触发——当
divisor(x) > div_max时,div_val刚被赋值为x,div_val < x不可能成立。 - 重复计算约数个数:多次调用
divisor(x),既降低运行效率,也容易引入不必要的逻辑误差。
修正后的代码
def divisor(x): cnt = 0 # 优化:遍历到平方根即可,提升计算效率 for i in range(1, int(x**0.5) + 1): if x % i == 0: # 避免平方数的约数重复计数 cnt += 1 if i == x // i else 2 return cnt div_max = 0 div_val = 0 for _ in range(20): x = int(input()) current_cnt = divisor(x) # 优先判断约数个数是否更大 if current_cnt > div_max: div_max = current_cnt div_val = x # 再处理约数个数相同但数值更大的情况 elif current_cnt == div_max: if x > div_val: div_val = x print(div_val, div_max)
修正说明
- 调整判断逻辑:将「约数个数相同但数值更大」的判断单独作为
elif分支,确保后续出现符合条件的数时能正确更新结果。 - 优化约数计算:把遍历范围从
1到x改为1到sqrt(x),同时处理平方数的重复计数问题,大幅提升大数的计算速度。 - 缓存计算结果:将当前数的约数个数存入
current_cnt,避免重复调用函数计算,减少冗余操作。
内容的提问来源于stack exchange,提问作者Zehando
相关产品推荐
相关产品推荐

