Skip to main content

第17章 数位分离

数位分离指把一个整数拆分成个位、十位、百位等单独数字,常用于数字反转、判断回文、统计数字和等题型。

17.1 核心原理

对于十进制数字:

  1. num % 10 → 取出当前个位
  2. num / 10 → 去掉个位,缩小十倍 循环重复两步,直到数字变为0,即可取出全部数位(从低位到高位)。

17.2 基础代码:拆分正整数

#include <iostream>
using namespace std;
int main()
{
int num = 1234;
while(num > 0)
{
int d = num % 10;
cout << d << " ";
num = num / 10;
}
return 0;
}
// 输出:4 3 2 1

17.3 处理负数

负数直接取余可能出现负数位,先通过abs()转为正数再分离:

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int num = -567;
int n = abs(num);
while(n > 0)
{
int d = n % 10;
cout << d << " ";
n /= 10;
}
return 0;
}
// 输出:7 6 5

17.4 按原始高位顺序保存

分离得到的数字是逆序,存入数组后逆序输出即可还原顺序:

#include <iostream>
using namespace std;
int main()
{
int num = 1234;
int dig[20], cnt = 0;
while(num > 0)
{
dig[cnt++] = num % 10;
num /= 10;
}
// 逆序打印
for(int i = cnt - 1; i >= 0; i--)
cout << dig[i] << " ";
return 0;
}
// 输出:1 2 3 4

17.5 常见应用场景

  1. 数字反转 依次取出个位,乘十累加得到新数字。 例:123 → 321
  2. 回文数判断 分离数位前后对比,正反数字相等即为回文(121、1331)。
  3. 数位求和 循环累加每一位,计算所有数字之和。 例:123 → 1+2+3=6
  4. 统计某数字出现次数 分离过程判断当前数位是否等于目标数字并计数。

17.6 重要注意事项

  1. 数字为0时要单独判断,否则循环不会执行;
  2. 先取余、再整除,顺序不可颠倒;
  3. 负数务必取绝对值,防止出现负数字;
  4. 超大数字使用long long避免int溢出;
  5. 分离结果默认低位先出,如需高位在前要借助数组逆序。