整数拆分应优先用字符串转换法:调用std::to_string(n)转字符串,跳过负号后用c-'0'转数字,顺序天然正确;若用数学法需对0特判、负数取abs前防int_min溢出,并反转逆序结果。

用取余和整除逐位提取数字
整数拆分本质是把每一位数字单独拿出来,最直接的办法就是反复对 10 取余再整除。注意:这个方法得到的是从个位开始的逆序,比如 123 会先得到 3、再 2、最后 1。
- 对正数直接循环:
n % 10得当前个位,n /= 10去掉个位 - 对
0要单独处理,否则循环不执行,结果为空数组 - 负数建议先取绝对值(
abs(n)),否则%在 C++ 中符号依赖实现,可能出错 - 提取完记得反转数组,否则顺序是反的
用字符串转换绕过数学运算
如果数字范围不大(比如 int 内),转成 std::string 再遍历每个字符更直观,也天然支持 0 和负号处理。
-
std::to_string(n)得到字符串,若n是负数,首字符为'-' - 遍历时跳过负号:
if (c == '-') continue;,然后用c - '0'转成数字 - 不需要手动反转,顺序天然正确
- 注意:
std::string构造开销略大,高频调用或超大数时不推荐
存入哪种数组?vector 还是原生数组?
绝大多数情况用 std::vector<int></int>,动态长度、自动管理内存,避免越界风险。
- 别用固定长度原生数组(如
int arr[10]),整数位数不确定,容易溢出或浪费空间 - 如果必须用原生数组,得先估算最大位数(比如
int最多 10 位十进制数),再用new int[11]动态分配 -
vector的push_back()配合逆序提取,最后调std::reverse()即可 - 不要用
reserve()后直接下标赋值——没resize()的话下标访问是未定义行为
边界情况和常见错误
实际写的时候最容易栽在 0、负数、INT_MIN 这几个点上。
-
0:数学法循环条件n > 0会跳过,必须加特判:if (n == 0) vec.push_back(0); - 负数:
INT_MIN取abs()会溢出(因为-INT_MIN超出 int 范围),稳妥做法是转 string 或用long long中转 - 空 vector:提取后没检查是否为空就直接
reverse()没问题,但后续用front()/back()前要确认非空 - 字符转数字写成
c - 0是错的,必须是c - '0',否则得到 ASCII 码值
真正麻烦的不是逻辑,而是这些角落里的行为差异——尤其是 INT_MIN 和 abs 的组合,一不留神就 crash。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











