第17章 数位分离
info

GESP C++ 2 级综合应用:数位分离

数位分离融合了"循环 + 取余/整除"的基本功,是官方能力要求中"包含分支、循环的比较综合案例"的典型题型。字符串处理(第 14 章 ASCII)也常以它为前置。

第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
tip

数位分离 + ASCII 联动 把数字每一位变成字符输出时:第 14 章讲过 数字 + '0' 可转成数字字符。例如 cout << (d + '0'); 就把整数 5 按字符 '5' 打印。

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. 分离结果默认低位先出,如需高位在前要借助数组逆序。
caution

0 的特殊情况 num = 0 时 while (num > 0) 一次都不执行,直接跳过。若题目要求处理 0(如"输出 0 的每一位"),要单独 if (num == 0) cout << 0; 处理。

练习题(2 级单选风格)

  1. 下列代码执行后输出什么?
    int num = 123, s = 0;
    while (num > 0) {
    s = s * 10 + num % 10;
    num /= 10;
    }
    cout << s;
    • A. 123
    • B. 321
    • C. 6
    • D. 3
  2. 表达式 123 % 10 的结果是?
    • A. 12
    • B. 3
    • C. 123
    • D. 1
  3. 分离各位数字时,"先取余 % 再整除 /"的顺序?
    • A. 可以随意颠倒
    • B. 不能颠倒,颠倒会先丢失个位
    • C. 无所谓
    • D. 只影响速度不影响结果
  4. 当 num = 0 时,while (num > 0) 循环体?
    • A. 执行一次
    • B. 死循环
    • C. 一次都不执行
    • D. 编译报错
  5. 要取出 1234 的"千位"数字 1,应当使用?
    • A. 1234 % 1000
    • B. 1234 / 1000
    • C. 1234 % 10
    • D. 1234 / 10
参考答案(点击展开)
  1. B — 每次取末位拼到 s:s 依次变 3、32、321,实现整数反转,输出 321。
  2. B — % 取余,123 % 10=3(个位)。
  3. B — 必须先 %10 取个位,再 /10 去掉个位;若先 /10 会先丢掉个位,顺序不能颠倒。
  4. C — 0 > 0 为假,循环条件不成立,循环体一次都不执行,需单独处理 0。
  5. B — 整除掉低三位:1234 / 1000=1,得到千位;%1000 得 234、%10 得个位 4、/10 得 123。
SShowball OI知识手册