循环的综合应用
看完你能把嵌套、边界与终止条件拆干净,独立设计复杂循环
按 空格/→ 演示下一步
全部页面点击任意一页,跳回舞台从这页播放
循环的综合应用
看完你能把嵌套、边界与终止条件拆干净,独立设计复杂循环
三大循环回顾
上一页我们跑通了循环的实际问题,这一页先回头盘点手上的三件工具。选错循环就像拿勺子吃面条——也能吃,但很别扭。先把各自的脾气摸清楚,后面组合使用才顺手。
已知路程选公交(for),看路况开车(while),先上车再补票(do-while)
嵌套循环:行与列
上一页我们把三大循环都摸了一遍:它们都是「一圈一圈走」。可要是电影票按「几排几座」找位置,走完一排才能去下一排——这就要两个循环搭伙了。
找某排对应外层循环,排内逐座找对应内层循环
什么是穷举
上页嵌套循环让循环里套循环,形成「外层走一步、内层走一圈」的结构。这正好能用来做一件事:把所有可能的组合一个不漏地试一遍——这就是穷举。
密码锁逐位试组合对应循环逐个生成候选
穷举的解题步骤
穷举所有答案,靠三步走:圈范围、定条件、留结果。
穷举例题代码
用双层循环穷举公鸡母鸡小鸡数量,解百钱百鸡问题。
外层定公鸡数,内层遍历母鸡数,小鸡由总数量 100 直接推出——枚举空间从 10⁶ 压到约 700 次判断。
数的排列组合问题
上一页我们用穷举解出了一道例题。现在换个更烧脑的场景:用数字 1、2、3 能组成多少个没有重复数字的三位数?一个个写出来太累,让循环替我们排队试。
转盘每一位独立转动,三位各转一轮就试遍所有组合
筛选满足条件的数
一段循环+拆位代码,找出100~999中所有水仙花数,看取余和整除怎么逐位拆数。
整除砍高位、取余留低位,两者配合拆出每一位,再立方求和穷举检验,命中即输出。
自测:拆位判断
要用循环把正整数 n 的各位数字从个位到高位逐个取出,循环体该写什么?
为什么只看末三位
乘法末三位的数学性质
末三位求解代码
用「乘一次、截一次」的迭代写法求 a^n 的末三位,看清取余为什么不会丢信息。
乘法只受末三位影响: (x·a) 的末三位 = (x 的末三位 · a) 的末三位。所以每步 %1000 截断,数值永不超 300 万,任何 n 都不溢出。
迭代过程可视化
从左到右跟一个变量走完循环:初始化、判断、执行、更新,每步看它的值变成多少。
从实心到空心
上一页我们用「行循环套列循环」打印出了实心矩形:每个位置都放星号。现在提一个小挑战——只要边框、不要填充,该怎么办?答案就藏在每个位置的行列编号里。
笔尖只沿格子边缘描线,对应行列落在边界上才落星号
空心图案代码
看 if 判断如何让同一行循环里,只有边缘位置才打印星号。
把「边缘」翻译成坐标条件:i 是行、j 是列,首末行列打星,内部位置只打空格。
实心 vs 空心
两者代码几乎一样,却只差一个条件判断——搞清这行 if,就掌握了图案打印的核心。
- 每行输出所有列:j 从 1 到 n 全打印
- 条件判断可有可无,逻辑最简单
- 行列关系只决定行数,不筛选位置
- 先判断位置:j==1 或 j==n 才打印
- 必须有 if,否则边界不成立时输出空格
- 行列关系用于筛选:边界打印,内部留空
循环应用问题地图
从「循环」出发,按问题特征分四条路径:先判断目标是全找、挑着找、一步步推,还是摆形状,再选对应写法。
本套图解要点
- ✓三大循环可互换,for 适合已知次数
- ✓嵌套循环:外层控行,内层控列
- ✓穷举 = 全部试一遍 + 条件筛选
- ✓拆位处理:取余拿低位,除法去位
- ✓图案空心的关键是边界条件判断
课后思考
先自己想一会儿,再对照参考答案——问题没有唯一解。
参考答案关键在首次条件判断:do-while 先执行一次再判断,循环体至少跑一遍。想想菜单交互、输入校验,是不是天然要求'先做一次'?
参考答案空心图案靠'行列坐标满足边界/对角线条件才打印'。X 形是两条对角线:行号==列号,或行号+列号==宽+1。条件变了,循环框架不变。
参考答案乘方增长的规律:高位的值不影响后续只由低几位决定的部分(模运算性质)。'至少一次'只需去掉'最末尾'的位置限制,扫描所有窗口。