C++魔法代码学院:第 5 课——特殊的余数(取模运算)

2026-01-19
229

—— 寻找被除法丢弃的宝藏

  • 课时时长:90 分钟
  • 核心目标

    1. 理解 取模 % 就是求余数。
    2. 掌握 % 的两大核心用途:

      • 周期侦探:判断奇偶(% 2)、星期计算(% 7)。
      • 数字手术刀:提取数字的个位(% 10)。
    3. 难点攻克:综合运用 /% 进行多位数的数位分离(GESP 必考)。

  • 所需教具:10 个苹果(或糖果),3 个盘子。

课程时间表

环节 时间 内容 教学隐喻/活动
复习 10 min 整数除法的“去尾” “除法之刀”的回顾
概念 15 min 认识取模符号 % 分苹果游戏(实物演示)
应用 A 15 min 周期侦探(奇偶与星期) 0和1的秘密暗号
核心 25 min 数位分离术(个十百) “砍头去尾法”
实战 15 min 编写“倒序输出器” 输入123,输出3 2 1
总结 10 min 总结与技巧 /% 的组合拳

详细教学流程

1. 复习:除法之刀 (10 min)

  • 提问cout << 10 / 3; 输出几?(答案:3)。
  • 追问:我们在数学课上算出 。上节课我们说 C++ 的除法很无情,把余数 1 扔进了垃圾桶。
  • 引入:今天我们要去垃圾桶里,把这个被丢掉的 1 捡回来!因为它是开启宝箱的钥匙。

2. 概念:分苹果与百分号 (15 min)

  • 符号介绍

    • 它的名字叫 “取模” (Mod),符号是 %
    • 注意:虽然它长得像百分号,但在代码里它跟 100% 没有任何关系!它是“求余数”的意思。
  • 实物演示:分苹果

    • 拿出 10 个苹果,请 3 位同学上来。
    • 规则:必须平均分,不能切开。
    • 过程:每人拿 1 个...每人拿 2 个...每人拿 3 个。
    • 现状:手里还剩 1 个。分不下去了。
    • 结论
      • 10 / 3 的结果是 3 (每人手里的)。
      • 10 % 3 的结果是 1 (老师手里剩下的)。
  • 代码体验

    cout << 10 % 3 << endl; // 输出 1
    cout << 5 % 2 << endl;  // 输出 1
    cout << 4 % 2 << endl;  // 输出 0 (没有余数就是 0)
    

3. 应用 A:周期侦探 (15 min)

  • 侦探任务 1:奇数还是偶数?

    • 规则:任何整数,只要被 2 除,余数只有两种情况。

      • 余数是 0 -> 偶数(双数)。
      • 余数是 1 -> 奇数(单数)。
    • 代码口诀n % 2 是判断奇偶的照妖镜。

  • 侦探任务 2:今天是星期几?

    • 提问:如果今天是星期三,过了 7 天是星期几?(还是星期三)。
    • 原理:世界是转圈圈的,每 7 天转一圈。
    • 计算

      • 过了 10 天是星期几?
      • \(10 \div 7 = 1\) 圈 ... 余 3 天。
      • 所以是星期三 + 3天 = 星期六。
    • 代码future_day = (today + days) % 7; (注:此处简单带过逻辑即可,不需深究代码细节)。

4. 核心:数字手术刀——数位分离 (25 min) <-- GESP 必考重难点

  • 任务:输入一个三位数 123,我们要把 1, 2, 3 分别拆出来存到变量里。
  • 难点:电脑不认识“个位”,它只认识数字。
  • 工具介绍

    • 工具 A:% 10 (取尾刀) —— 专门切下最后一位。
    • 工具 B:/ 10 (砍头刀) —— 专门砍掉最后一位。
  • 手术步骤(板书演示 123

    1. 取个位

      • % 10
      • 123 % 10 = 3 (余数就是个位)。
      • 口诀:模 10 得到小尾巴。
    2. 准备取十位(先砍一刀)

      • 3 已经被取走了,我们想把 123 变成 12。
      • / 10
      • 123 / 10 = 12 (整数除法,3 被砍掉了)。
    3. 取十位(也就是现在的个位)

      • 对着剩下的 12 再用 % 10
      • 12 % 10 = 2
    4. 取百位

      • 再砍一刀:12 / 10 = 1
      • 1 % 10 = 1 (或者直接用剩下的 1)。

5. 实战:倒序输出器 (15 min)

  • 题目:输入一个三位数(如 582),请输出 285。
  • 代码带练

    int n;
    cout << "请输入一个三位数: ";
    cin >> n; // 假设输入 582
    
    int g = n % 10;         // 个位:582 % 10 = 2
    int s = (n / 10) % 10;  // 十位:582 / 10 = 58;  58 % 10 = 8
    int b = n / 100;        // 百位:582 / 100 = 5
    
    // 输出
    cout << g << " " << s << " " << b << endl; 
    

  • 注意:中间的 s 最难理解,可以拆成两步写:int temp = n / 10; int s = temp % 10;

6. 总结与技巧 (10 min)

  • 知识点回顾

    • % 是求余数。
    • % 2 用来分奇偶。
    • % 10 用来拿个位。
    • / 10 用来丢个位。
  • 避坑

    • 小数不能取模!3.5 % 2 会报错。% 只能用于整数。
    • 不要对 0 取模(n % 0),虽然数学上没意义,代码里会报错。

课后作业:密码破解员

  1. 基础题

    • 输入一个整数,输出它除以 5 的余数。
  2. 核心题(数位求和)

    • 输入一个三位数(例如 123)。
    • 计算各位数字之和(1 + 2 + 3 = 6)。
    • 输出这个和。
  3. 挑战题(倒序数字算术)

    • 输入 123
    • 让电脑通过计算生成一个新的数字 321 (注意:不是打印三个字符,而是生成一个整数变量)。
    • 提示个位 * 100 + 十位 * 10 + 百位

给教练的教学话术建议

  • 关于 % 的读法:建议直接读“模”(mó),或者通俗点读“求余”。不要读“百分号”,以免和格式化输出混淆。
  • 关于数位分离:这是 3-5 年级孩子遇到的第一个逻辑门槛。建议用积木或乐高演示:

    • 123 是三块积木连在一起。
    • / 10 是把最后一块掰掉扔垃圾桶。
    • % 10 是只把最后一块拿在手里看一看,主体还在。
  • 互动游戏:报数游戏。全班从 1 开始报数,遇到 7 的倍数或者个位是 7 的数(n % 7 == 0n % 10 == 7)就拍手。这是 GESP 经典的“逢七过”逻辑,虽然还没学 if,但可以先建立这种数学直觉。