C++整数各位数字求和函数输出异常,请求排查问题原因
问题分析与修复方案
嘿,我帮你看看这段代码的问题哈,你遇到的输出错误主要有几个关键原因:
1. 未初始化的变量导致垃圾值干扰
你在sumDigits函数里定义了int tmp;,但没有给它初始值。当你执行tmp+=a[i];的时候,tmp一开始是内存里的随机垃圾值,最终的求和结果就是这个垃圾值加上各位数字之和——这就是为什么你会得到2686935这种完全不符合预期的数,这是最直接的错误。
2. 数字分解逻辑冗余且存在隐患
你的while循环里加了不必要的判断条件,虽然在输入12745时可能刚好分解出所有数字,但逻辑太绕,很容易在其他输入下出错。比如如果输入是1000,这种写法虽然可能得到正确结果,但完全没必要,而且容易让人混淆分解逻辑。
3. 全局vector带来的副作用
你把vector<int> a定义成了全局变量,虽然这次只调用一次函数不会出问题,但如果后续多次调用sumDigits,之前的数字会一直留在vector里,导致求和结果彻底错误。
修复后的代码
我给你简化并修正了代码,逻辑更清晰,也解决了所有问题:
#include <iostream> #include <cstdlib> // 用于abs函数处理负数 using namespace std; int sumDigits(int n) { int sum = 0; // 初始化求和变量为0,避免垃圾值 n = abs(n); // 处理负数情况,确保负数的各位数字和与正数一致 // 核心分解逻辑:只要还有数字,就不断取最后一位累加 while (n > 0) { sum += n % 10; // 取当前数的最后一位加到sum n /= 10; // 去掉最后一位数字 } return sum; } int main() { cout << sumDigits(12745) << endl; // 输出预期的19 return 0; }
修复说明
- 去掉了全局vector,改用局部变量
sum,彻底避免全局变量的副作用。 - 明确初始化
sum为0,确保求和从正确的起点开始。 - 简化了分解逻辑:不管输入是几位数,只要
n>0就循环分解,逻辑直观且不会出错。 - 增加了
abs(n)处理负数场景(比如输入-12745也能得到正确的19)。
内容的提问来源于stack exchange,提问作者P.Petrov
相关产品推荐
相关产品推荐

