为何初始版sum_divisors函数无法正确计算数字真因子和?
为什么你的初始真因子求和代码会失效?
核心问题出在你初始代码的while循环条件上,咱们来拆解对比下:
先看你的初始代码:
def sum_divisors(n): sum = 0 factor = 1 # Return the sum of all divisors of n, not including n while n % factor == 0 and factor < n: sum = sum + factor factor = factor + 1 return sum
这里的循环条件是n % factor == 0 and factor < n——这意味着只有当当前factor是n的因子时,循环才会继续执行。一旦遇到第一个不是n因子的数(比如计算n=12时的factor=5),循环就会直接终止,不会再检查后面的数了!
举个实际例子:计算n=12的真因子和(正确结果是1+2+3+4+6=16)
- factor=1:12%1==0 → 加入sum,sum=1,factor=2
- factor=2:12%2==0 → 加入sum,sum=3,factor=3
- factor=3:12%3==0 → 加入sum,sum=6,factor=4
- factor=4:12%4==0 → 加入sum,sum=10,factor=5
- factor=5:12%5=2≠0 → 循环条件不满足,直接退出,返回sum=10(漏掉了后面的因子6)
再看你修改后的正确代码:
def sum_factors(n): sum = 0 factor = 1 # Return the sum of all factors of n, not including n while n!=0 and factor < n: if n % factor == 0: sum = sum + factor factor = factor + 1 else: factor = factor + 1 return sum
这里的循环条件是n!=0 and factor < n——只要factor还小于n,不管它是不是因子,循环都会继续。然后在循环内部用if判断当前factor是否是因子,是就加进sum,否则直接跳过,继续检查下一个factor。这样就能遍历所有小于n的数,不会漏掉任何可能的因子。
简单来说,你初始代码把「判断是否为因子」和「循环是否继续」绑定在了一起,导致遇到非因子就提前终止循环;而正确的逻辑是先保证遍历完所有候选数,再逐个判断是否为因子。
内容的提问来源于stack exchange,提问作者Eugene
相关产品推荐
相关产品推荐

