C++求字符串中所有整数数字之和有没有更优的实现方案?
字符串数字求和的更优实现
你的原有实现可以大幅简化,核心优化点是不需要先拼接所有数字字符再拆分求和,遍历字符时遇到数字可以直接转成对应数值累加即可,C++标准规定数字字符'0'到'9'的ASCII值是连续递增的,用字符本身减去'0'就能直接得到对应的整数值。
优化后最简实现
#include <iostream> #include <string> #include <cctype> using namespace std; int main() { string s = "124j3a.n2-'ad2'&1#vvg6"; int sum = 0; for (char c : s) { if (isdigit(c)) { sum += c - '0'; } } cout << sum << endl; return 0; }
优化点说明
- 仅需一次遍历即可完成计算,时间复杂度O(n),无额外内存开销,空间复杂度O(1),运行效率远高于原实现
- 不存在拼接数字过长导致的
stoi整数溢出问题,不管字符串内有多少个数字都能正常计算 - 逻辑更直观,代码可读性更高
- 补充了原代码缺失的
<iostream>头文件依赖,符合C++标准语法要求
可选现代C++ STL写法
如果你偏好函数式风格,可以用std::accumulate实现一行求和:
#include <iostream> #include <string> #include <cctype> #include <numeric> using namespace std; int main() { string s = "124j3a.n2-'ad2'&1#vvg6"; int sum = accumulate(s.begin(), s.end(), 0, [](int acc, char c) { return isdigit(c) ? acc + (c - '0') : acc; }); cout << sum << endl; return 0; }
内容的提问来源于stack exchange,提问作者jaideep singh
相关产品推荐
相关产品推荐

