info
GESP C++ 2 级综合应用:数位分离
数位分离融合了"循环 + 取余/整除"的基本功,是官方能力要求中"包含分支、循环的比较综合案例"的典型题型。字符串处理(第 14 章 ASCII)也常以它为前置。
第17章 数位分离
数位分离指把一个整数拆分成个位、十位、百位等单独数字,常用于数字反转、判断回文、统计数字和等题型。
17.1 核心原理
对于十进制数字:
num % 10→ 取出当前个位;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 常见应用场景
- 数字反转 依次取出个位,乘十累加得到新数字。 例:123 → 321
- 回文数判断 分离数位前后对比,正反数字相等即为回文(121、1331)。
- 数位求和 循环累加每一位,计算所有数字之和。 例:123 → 1+2+3=6
- 统计某数字出现次数 分离过程判断当前数位是否等于目标数字并计数。
17.6 重要注意事项
- 数字为 0 时要单独判断,否则循环不会执行;
- 先取余、再整除,顺序不可颠倒;
- 负数务必取绝对值,防止出现负数字;
- 超大数字使用
long long避免 int 溢出; - 分离结果默认低位先出,如需高位在前要借助数组逆序。
caution
0 的特殊情况
num = 0 时 while (num > 0) 一次都不执行,直接跳过。若题目要求处理 0(如"输出 0 的每一位"),要单独 if (num == 0) cout << 0; 处理。
练习题(2 级单选风格)
- 下列代码执行后输出什么?
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
- 表达式
123 % 10的结果是?- A. 12
- B. 3
- C. 123
- D. 1
- 分离各位数字时,"先取余
%再整除/"的顺序?- A. 可以随意颠倒
- B. 不能颠倒,颠倒会先丢失个位
- C. 无所谓
- D. 只影响速度不影响结果
- 当
num = 0时,while (num > 0)循环体?- A. 执行一次
- B. 死循环
- C. 一次都不执行
- D. 编译报错
- 要取出 1234 的"千位"数字 1,应当使用?
- A.
1234 % 1000 - B.
1234 / 1000 - C.
1234 % 10 - D.
1234 / 10
- A.
参考答案(点击展开)
- B — 每次取末位拼到
s:s依次变 3、32、321,实现整数反转,输出 321。 - B —
%取余,123 % 10=3(个位)。 - B — 必须先
%10取个位,再/10去掉个位;若先/10会先丢掉个位,顺序不能颠倒。 - C —
0 > 0为假,循环条件不成立,循环体一次都不执行,需单独处理 0。 - B — 整除掉低三位:
1234 / 1000=1,得到千位;%1000得 234、%10得个位 4、/10得 123。