161 lines
4.1 KiB
Markdown
161 lines
4.1 KiB
Markdown
# 第2课:循环结构 + 数位拆解
|
||
|
||
## 教学目标
|
||
- 掌握 for、while 和 do-while 循环的使用场景
|
||
- 掌握数位拆解技巧(取个位、去个位)
|
||
- 能用循环判断回文数
|
||
- 了解水仙花数的判断方法
|
||
|
||
## 核心考点:循环边界与数位拆解
|
||
|
||
### 考什么
|
||
判断循环次数和结束条件,并用循环完成求各位和、________数字、判断回文数等任务。
|
||
|
||
### 必须理解
|
||
次数明确时常用________;结束条件更自然时常用________。数位拆解每轮依次完成:________、使用这一位、________。如果后面还要使用原数,必须先________。
|
||
|
||
### 核心写法
|
||
```cpp
|
||
int num = ________;
|
||
int rev = 0;
|
||
while (num > 0) {
|
||
int d = num ________ 10;
|
||
rev = rev * ________ + d;
|
||
num ________ 10;
|
||
}
|
||
```
|
||
|
||
### `do-while` 循环
|
||
|
||
`do-while` 的特点:循环体至少执行 ______ 次。
|
||
|
||
```cpp
|
||
do {
|
||
// 循环体
|
||
} while (条件); // 结尾不要漏掉 ______
|
||
```
|
||
|
||
### 常见错误
|
||
- 忘记更新循环变量会发生什么?________________
|
||
- `i < n` 与 `i <= n` 的执行次数有什么区别?____________
|
||
- 为什么反转前要备份原数?________________
|
||
|
||
### 判断是否掌握
|
||
- [ ] 我能判断循环的起点、终点和次数。
|
||
- [ ] 我能写出取个位与去个位。
|
||
- [ ] 我能独立完成数字反转。
|
||
|
||
---
|
||
|
||
## 课堂编程题
|
||
|
||
### 课堂1:奇偶分组统计【适中】
|
||
|
||
**题目描述:** 输入正整数 `n`,分别求 `1~n` 中奇数之和、偶数之和,并计算 `1~n` 的乘积。若乘积超过 `10^18`,输出 `TOO LARGE`。
|
||
|
||
**输入格式:** 输入一个正整数。
|
||
|
||
**输出格式:** 第一行奇数和与偶数和;第二行乘积或 `TOO LARGE`。
|
||
|
||
**数据范围:** `1≤n≤30`。
|
||
|
||
**输入样例:**
|
||
```text
|
||
5
|
||
```
|
||
|
||
**输出样例:**
|
||
```text
|
||
9 6
|
||
120
|
||
```
|
||
|
||
**解题思路:** 一个 `for` 循环同时完成奇偶累加;累乘前判断 `product>10^18/i`,避免溢出。
|
||
|
||
**易错提醒:** 范围是 `1~n`,循环条件必须为 `i<=n`;累加器和累乘器的初值分别为 0 和 1。
|
||
|
||
---
|
||
|
||
### 课堂2:数字分析报告【适中】
|
||
|
||
**题目描述:** 输入一个非负整数,输出它的位数、各位数字之和、最大数字和反转数。
|
||
|
||
**输入格式:** 输入一个非负整数。
|
||
|
||
**输出格式:** 依次输出位数、各位和、最大数字、反转数。
|
||
|
||
**数据范围:** `0≤n≤10^9`。
|
||
|
||
**输入样例:**
|
||
```text
|
||
50230
|
||
```
|
||
|
||
**输出样例:**
|
||
```text
|
||
5 10 5 3205
|
||
```
|
||
|
||
**解题思路:** 备份原数,用 `while` 重复"取个位、使用个位、去个位";单独处理 `n=0`。
|
||
|
||
**易错提醒:** 反转后的前导零不会保留;0 本身有一位,不能被普通循环漏掉。
|
||
|
||
---
|
||
|
||
### 课堂3:寻找第一个合格数【适中】
|
||
|
||
**题目描述:** 从 `1~n` 中寻找第一个同时满足"能被 7 整除、不能被 5 整除、各位和大于 10"的数。跳过所有含数字 4 的数;找到后立即输出,否则输出 `NONE`。
|
||
|
||
**输入格式:** 输入一个正整数。
|
||
|
||
**输出格式:** 第一个合格数或 `NONE`。
|
||
|
||
**数据范围:** `1≤n≤100000`。
|
||
|
||
**输入样例:**
|
||
```text
|
||
100
|
||
```
|
||
|
||
**输出样例:**
|
||
```text
|
||
77
|
||
```
|
||
|
||
**解题思路:** 外层枚举数字;拆位检查含 4 和各位和。含 4 时 `continue`,找到答案时 `break`。
|
||
|
||
**易错提醒:** `continue` 跳过本轮,`break` 结束整个当前循环,两者含义不同。
|
||
|
||
---
|
||
|
||
### 课堂4:区间素数统计【适中·双层循环】
|
||
|
||
**题目描述:** 输入 `L` 和 `R`,输出闭区间内的所有素数及素数个数。
|
||
|
||
**输入格式:** 输入区间的左端点和右端点。
|
||
|
||
**输出格式:** 第一行按升序输出素数;第二行输出个数。没有素数时第一行输出 `NONE`。
|
||
|
||
**数据范围:** `1≤L≤R≤10000`。
|
||
|
||
**输入样例:**
|
||
```text
|
||
10 20
|
||
```
|
||
|
||
**输出样例:**
|
||
```text
|
||
11 13 17 19
|
||
4
|
||
```
|
||
|
||
**解题思路:** 外层枚举候选数,内层从 2 检查到平方根;找到因数立即 `break`。
|
||
|
||
**易错提醒:** 1 不是素数;内层的 `break` 只结束因数检查,不会结束外层枚举。
|
||
|
||
---
|
||
|
||
## 课后作业
|
||
|
||
> 请完成本课对应的课后作业,见编程题文件。
|