
本文详解如何编写python函数,准确计算任意非负整数各位数字之和(如输入29返回11),指出原代码逻辑错误,并提供简洁、健壮、可直接运行的实现方案。
本文详解如何编写python函数,准确计算任意非负整数各位数字之和(如输入29返回11),指出原代码逻辑错误,并提供简洁、健壮、可直接运行的实现方案。
你提供的原始代码 superdigito(y) 实际上实现的是超级数位(superdigit)——即不断重复求数位和直至结果为个位数(如29 → 2+9=11 → 1+1=2),因此输入29时返回2是符合该逻辑的,但与题目要求“sum all the digits in the inputed number”(仅求一次各位数字之和)不符。
要严格实现“对输入数字的所有数位求一次和”,关键在于:不循环压缩至个位,而只做单轮分解与累加。以下是修正后的标准解法:
def sum_digits(n):
"""计算非负整数n所有数位的和,例如 sum_digits(29) 返回 11"""
if n < 0:
raise ValueError("输入必须是非负整数")
total = 0
while n > 0:
total += n % 10 # 取个位数字
n //= 10 # 去掉个位
return total
# 示例使用
y = int(input("请输入一个非负整数: "))
print("各位数字之和:", sum_digits(y))✅ 正确性验证:
- 输入 29 → 29 % 10 = 9, 29 // 10 = 2 → total = 9;再循环:2 % 10 = 2, 2 // 10 = 0 → total = 9 + 2 = 11
- 输入 0 → 循环不执行,返回 0(需注意:原逻辑中 while n > 0 对0返回0,符合数学定义)
⚠️ 注意事项:
立即学习“Python免费学习笔记(深入)”;
- 该函数默认处理非负整数;若需支持负数,可先取绝对值:n = abs(n)
- 字符串转换法(sum(int(d) for d in str(n)))虽简洁,但在极端大数或性能敏感场景下不如纯数学方法高效且更显式可控
- 避免混淆“数位和”(digit sum)与“超级数位”(repeated digit sum)——后者需递归或外层循环,本题仅需前者
总结:明确需求是关键。题目要求的是一次性数位求和,而非迭代归约。使用模10取余与整除10降位的组合,既高效又无依赖,是Python中处理此类问题的标准范式。


















