在线编译器 C

#include <stdio.h> int digit_sum(unsigned int n) { int temp=0; if(n==0) { return n; } if(n<10) { return n; } int a=n; while(n/10!=0) { temp=temp+n%10; n=n/10; if(n<10) {temp=temp+n;} } return temp; }
这段代码定义了一个函数 `digit_sum`,目的是计算一个无符号整数的各位数字之和。代码中使用了循环和条件判断,但逻辑上有些冗余和混乱。

- 函数开头对 `n==0` 和 `n<10` 的处理是多余的,因为这两种情况其实都可以被后面的循环正确处理,不需要单独返回。
- 循环条件 `while(n/10!=0)` 意味着当 n 只有一位数时循环不执行,但循环内部又用 `if(n<10)` 来额外处理最后一位,这导致逻辑重复且容易出错。例如,当输入为 123 时,循环会先处理个位 3,然后 n 变成 12,再处理 2,最后 n 变成 1,此时循环条件不满足,但循环内的 `if(n<10)` 已经执行过,导致最后一位 1 没有被正确累加。
- 变量 `a` 被赋值但从未使用,可以删除。

提示:
- 思考循环的终止条件:当 n 变为 0 时,所有位都已处理完毕。可以尝试用 `while(n != 0)` 作为循环条件,这样每次循环只处理当前最低位,然后 n 除以 10,直到 n 为 0。
- 检查循环内部对最后一位的处理是否多余。如果循环条件改为 `n != 0`,那么循环体内只需累加 `n % 10` 并更新 `n = n / 10`,不需要额外的 `if` 判断。