
本文介绍如何编写简洁、正确的python函数,将输入的非负整数的每一位数字相加并返回总和(如输入29 → 输出11),并指出原代码逻辑错误及修复方法。
本文介绍如何编写简洁、正确的python函数,将输入的非负整数的每一位数字相加并返回总和(如输入29 → 输出11),并指出原代码逻辑错误及修复方法。
你提供的原始代码 superdigito(y) 实际上实现的是反复求数字根(digital root)——即不断将各位数字相加,直到结果为个位数(例如 29 → 2+9=11 → 1+1=2)。因此输入 29 时返回 2 是符合该逻辑的,但与题目要求“仅求所有数字的一次性总和(2+9=11)”不符。
要实现题目明确要求的 “sum all the digits in the inputed number”(即单次各位相加,不递归压缩),应移除外层 while y >= 10 循环,仅保留一次遍历提取并累加各位数字。以下是修正后的标准实现:
def sum_digits(n):
"""返回非负整数n的所有十进制数字之和"""
if n 0:
total += n % 10
n //= 10
return total
# 示例使用
y = int(input("Digite um número inteiro: "))
print("Todos os dígitos somados:", sum_digits(y))
✅ 正确运行示例:
- 输入 29 → 输出 11
- 输入 123 → 输出 6(1+2+3)
- 输入 0 → 输出 0
⚠️ 注意事项:
- 该函数默认处理 n >= 0;若需支持负数,可先取绝对值:n = abs(n);
- 字符串方案(如 sum(int(d) for d in str(n)))虽简洁,但在极端大数或性能敏感场景下,纯数学解法(模10取余)更稳健、无字符串开销;
- 原代码中 y //= 10 在内层循环后直接覆盖了原始输入值,导致外层循环误判——这是混淆“单次求和”与“数字根”的典型逻辑错误。
总结:明确需求是关键——题目只要“各位数字之和”,而非“数字根”。一次模除循环足矣,无需递归压缩。保持函数职责单一,既提升可读性,也避免隐式行为偏差。











