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

求除自身外约数和:首次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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 14:23:15