Files
project1/第02课-循环结构/教案-教师版.md
2026-07-02 16:54:05 +08:00

5.5 KiB
Raw Permalink Blame History

第2课循环结构 + 数位拆解

教学目标

  • 掌握 for、while 和 do-while 循环的使用场景
  • 掌握数位拆解技巧(取个位、去个位)
  • 能用循环判断回文数
  • 了解水仙花数的判断方法

核心考点:循环边界与数位拆解

考什么

常见题型要求重复执行固定次数、在条件成立时持续循环,或逐位处理一个整数,例如求各位和、反转数字、判断回文数。考点既包括循环写法,也包括循环何时开始、何时结束。

必须理解

for 适合次数明确的重复,while 适合结束条件更自然的过程。数位拆解每轮做三件事:n % 10 取个位,使用这个个位完成统计或拼接,n /= 10 去掉个位。因为 n 会不断变小,若后面还要与原数比较,必须提前备份。循环边界要保证每个需要处理的值恰好进入一次,不能漏掉终点或多执行一轮。

核心写法

int original = n;
int reversed = 0;
while (n > 0) {
    int digit = n % 10;
    reversed = reversed * 10 + digit;
    n /= 10;
}
bool isPalindrome = (reversed == original);

取位、使用、去位的顺序不能乱;n /= 10 还保证循环最终结束。

do-while 循环

do-while 会先执行循环体,再判断条件,因此循环体至少执行一次。适合“先操作一次,再决定是否继续”的场景。

int number;
do {
    cin >> number;
} while (number != 0);

注意结尾的分号不能漏掉。三种循环选择原则:次数明确优先 for;先判断再重复常用 while;至少执行一次使用 do-while

常见错误

  • 忘记备份原数,拆解结束后 n 已变成 0。
  • 忘记更新循环变量,造成死循环。
  • i < ni <= n 混用,导致少算或多算一次。
  • 反转数字时漏写 reversed * 10,无法给新个位腾出位置。

判断是否掌握

能判断一个任务该用 for 还是 while,能准确写出循环范围,并能独立完成取个位、去个位、求各位和或反转数字。


题目一:判断回文数

核心代码(一句话)

回文数的核心:把数字反转,看反转后和原数是否相等。 反转靠三行代码——取个位、拼新数、去个位。

自然语言思路

回文数就是"正着读反着读都一样"的数,比如 12321、4554、7。

怎么判断?分三步走:

第一步:备份原数。 因为待会儿要拆解它,拆完就没了,所以先用 temp = n 把原数存好。

第二步:反转数字。 这是核心!口诀:"取个位、拼新数、去个位",循环直到原数变成 0。

以 123 为例,手推一遍:

轮次 原数 temp 个位 d = temp%10 反转数 rev = rev×10+d temp = temp/10
第1轮 123 3 0×10+3 = 3 12
第2轮 12 2 3×10+2 = 32 1
第3轮 1 1 32×10+1 = 321 0
结束 0 321

反转 123 得到 321。这个过程就像把数字"倒着拼回去"。

第三步:比较。 原数 n备份的和反转数 rev 相等 → 回文数!

伪代码

输入 n
temp = n                         // 备份原数
rev = 0                          // 反转数初始为0
当 temp > 0:
    d = temp % 10                // 取个位
    rev = rev * 10 + d           // 拼到反转数的末尾
    temp = temp / 10             // 去掉个位
如果 rev == n:
    输出 "是回文数"
否则:
    输出 "不是回文数"

真实代码

#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;

    int rev = 0;            // 存放反转后的数
    int temp = n;           // 备份原数,因为要拆解

    while (temp > 0) {
        int d = temp % 10;  // ① 取个位
        rev = rev * 10 + d; // ② 拼到新数末尾
        temp /= 10;         // ③ 去掉个位
    }

    if (rev == n) {
        cout << "是回文数" << endl;
    } else {
        cout << "不是回文数" << endl;
    }
    return 0;
}

注意点

  1. 一定要备份原数temp = n 这一步不能省!否则 n 被拆解成 0 了,最后没法比较。
  2. while vs for:数位拆解用 while 更自然,因为事先不知道数字有几位。for 适用于知道循环次数的情况。
  3. temp % 10 取个位:任何整数模 10 就得到个位。如 12345 % 10 = 5。
  4. temp / 10 去个位:整数除法自动舍去余数。如 12345 / 10 = 1234。
  5. 边界0 和负数0 是回文数0反转还是0。负数一般不算回文数-121 反转是 121-GESP 一级不会考负数回文。
  6. 循环终止条件temp > 0,不是 temp >= 0(会导致死循环,因为 0/10 还是 0

题目二:(待橙子补充)

建议覆盖水仙花数、for循环基本用法等


核心代码(一句话)

自然语言思路

伪代码

真实代码


注意点


题目三:(待橙子补充)

建议覆盖break/continue、循环综合练习等


核心代码(一句话)

自然语言思路

伪代码

真实代码


注意点


本课打油诗

(数位拆解) 循环取位倒着排,个位拼到新数来。 除十去尾继续转,正反相等回文哉。

(回文数判断) 反转数字比原数,相等就是回文数。 备份原数不能忘,拆完再比才无误。


课后作业

(待补充) 1. 2.