
本文介绍如何编写python函数,准确计算用户输入的非负整数中每一位数字的总和(如输入29返回11),并指出原代码逻辑错误及修正方法。
本文介绍如何编写python函数,准确计算用户输入的非负整数中每一位数字的总和(如输入29返回11),并指出原代码逻辑错误及修正方法。
你提供的原始代码 superdigito(y) 实际上实现的是递归数字根(digital root)——即不断对各位数字求和,直到结果为个位数。例如输入 29 时:
- 第一轮:2 + 9 = 11
- 第二轮:1 + 1 = 2 → 最终返回 2
但根据题目要求“sum all the digits in the inputed number”(仅对原始输入的各位数字求一次和),29 应直接返回 11,而非继续迭代至个位。
✅ 正确解法只需单次遍历各位数字并累加,无需循环压缩到个位。以下是简洁、健壮的实现:
def sum_digits(n):
"""返回非负整数 n 的各位数字之和"""
if n < 0:
raise ValueError("仅支持非负整数")
total = 0
while n > 0:
total += n % 10
n //= 10
return total
# 获取用户输入并计算
try:
y = int(input("Digite um número inteiro: "))
result = sum_digits(y)
print(f"Todos os dígitos somados: {result}")
except ValueError as e:
print("Erro:", e)? 关键说明:
- n % 10 提取个位数字;n //= 10 去掉个位,逐位向高位推进;
- 该算法时间复杂度为 O(log₁₀n),空间复杂度 O(1);
- 对 0 的处理:while n > 0 在 n == 0 时跳过循环,返回 0 —— 符合预期(0 的各位和为 0);
- 若需支持负数,可先取绝对值:n = abs(n),但题干示例均为正数,建议明确输入约束。
⚠️ 注意:不要混淆「各位数字一次求和」与「数字根(digital root)」。前者是算术和,后者是模9运算(dr(n) = 1 + (n−1) % 9,当 n > 0)。本题明确要求前者,因此移除外层 while y >= 10 循环是核心修正。

















