作业比赛编号 : 3088 - 【CSPtch-Jing】循环5 | 短除法
短除法:拆出每一个数字
每次取出个位,再删掉个位,整数就会被拆成一个个数字。一、什么是“拆位”?
拆位就是把一个整数的每个数位拆出来。例如,538 可以拆成个位 8、十位 3、百位 5。
取出个位:t % 10
一个整数除以 10 的余数,就是它的个位数字。
例如:538 % 10 = 8。
例如:538 % 10 = 8。
删除个位:t / 10
整数除以 10 时,整数部分会去掉个位。
例如:538 / 10 = 53。
例如:538 / 10 = 53。
二、短除法的四个步骤
- 1
准备一个整数 t,还可以准备需要用到的变量。 - 2
用 t % 10 取出当前的个位数字。 - 3
用 t / 10 删除当前的个位数字。 - 4
只要 t > 0,就继续重复上面两步。
取余:找到末位
ge = t % 10;
变量 ge 保存刚刚取出的个位。
变量 ge 保存刚刚取出的个位。
整除:去掉末位
t = t / 10;
更新 t,准备处理下一个数字。
更新 t,准备处理下一个数字。
三、跟着 538 走一遍
每一轮先取个位,再把个位删除。注意:数字是从右往左取出来的。| 这一轮开始时的 t | 取出的个位 ge | 更新后的 t |
|---|---|---|
| 538 | 538 % 10 = 8 | 538 / 10 = 53 |
| 53 | 53 % 10 = 3 | 53 / 10 = 5 |
| 5 | 5 % 10 = 5 | 5 / 10 = 0 |
结果:取出的顺序是 8、3、5。当 t 变成 0 时,循环结束。
四、通用拆位模板
循环里面取出数字以后,要根据题目目的来写下一步:可以输出、判断、计算,或者重新组成一个新数字。int t;
cin >> t;
while (t > 0) {
int ge = t % 10; // 取出个位数字
t = t / 10; // 删除个位数字
// 在这里写题目需要的操作:
// 输出 ge,判断 ge,或用 ge 进行计算
}
注意:如果输入可能是 0,while (t > 0) 一次也不会执行。遇到这种题目,要先按照题意单独处理 0。
五、拆位以后可以做什么?
求数位和
准备 sum = 0,每次做 sum = sum + ge。
统计数字个数
准备 count = 0,每取出一个数字就做 count++。
判断某个数字
用 if 检查 ge 是否满足条件,例如是否为偶数。
倒序重组
准备 s = 0,每轮做 s = s * 10 + ge。
倒序重组示例:538 变成 835
int t, s = 0;
cin >> t;
while (t > 0) {
int ge = t % 10;
t = t / 10;
s = s * 10 + ge; // 把取出的数字接到 s 的末尾
}
cout << s;
六、写程序时的检查清单
- 有没有先写好变量的初始值?例如 sum = 0、s = 0。
- 循环条件是否正确?数字变成 0 后,循环应该结束。
- 每一轮有没有更新 t?如果忘记写 t = t / 10,循环可能停不下来。
- 有没有检查最小输入、最大输入,以及输入为 0 的情况?
- 完成程序后,至少用两组数字手算,逐轮检查 t、ge 和答案的变化。
记忆小口诀:取余拿末位,整除去末位;想做什么,就把操作写在循环里面。
七、练习路线
每天练习 1~2 题。动手写代码前,先用一句话说清楚:初始状态是什么?每一轮做什么?什么时候结束?
先练“取出每一位”,再练数位和、位数统计、判断数字,最后练习数字逆序。每周把错误分成“题意、初始化、循环条件、变量更新、输出格式”几类,改起来会更快。
