求除自身外约数和:首次while+if代码错误原因解析
解析你第一次写的代码问题
嘿,我来帮你拆解一下第一次的代码为啥会算出奇怪的结果~咱们一步步看:
首先看你首次写的代码:
def sum_divisors(n): sum = 0 divisor = 1 while divisor < n: if n == 0: return 0 else: n % divisor == 0 sum += divisor divisor += 1 return sum
核心问题1:无效的条件判断
你在else块里写的n % divisor == 0是个完全没用的表达式——它只是计算了“n能不能被divisor整除”这个结果,但既没有用if来判断这个结果,也没有把它赋值给变量,相当于白算。
这就导致:不管当前divisor是不是n的约数,你都会执行sum += divisor和divisor +=1。说白了,你这代码算的根本不是“约数之和”,而是从1到n-1所有整数的累加和!
比如:
- 当n=36时,1到35的和是
(35*36)/2 = 630,正好是你得到的错误结果; - 当n=102时,1到101的和是
(101*102)/2 = 5151,也和你看到的结果完全对应。
问题2:n==0的判断位置逻辑不合理
你把if n ==0放在了while循环里面,但当n=0时,while的条件是divisor < 0(divisor初始是1),这个条件永远不成立,循环根本不会执行,直接返回sum=0——虽然这个测试用例的结果是对的,但逻辑是错的。正确的做法应该是把n==0的判断放在函数最开头,一进来就处理这种特殊情况,避免进入后续循环。
对比你改后的正确代码
你后来用elif改写的代码,把n%divisor ==0作为判断条件,只有当divisor是n的约数时,才把它加到sum里,否则只推进divisor的值,这就正确筛选出了所有符合要求的约数,自然得到了正确结果。
内容的提问来源于stack exchange,提问作者Meer75
相关产品推荐
相关产品推荐

