循环嵌套笔记
------彭彭老师
一、循环嵌套基础:什么是"套娃循环"?
就像"俄罗斯套娃",一个循环里藏着另一个循环:
- 外层循环:控制"大步骤"(比如做几轮)
- 内层循环:控制"小步骤"(比如每轮重复做什么)
核心逻辑:外层循环每走1次,内层循环会完整走一遍(或按需走)。
二、课堂例题
例4.12 阶乘和
问题 :求 1! + 2! + ... + n!(比如n=3时,1+2+6=9)
知识点
- 外层循环:控制加到第几个数(
i从1到n) - 内层循环:计算每个数的阶乘(
i! = 1×2×...×i) - 累加:把每个阶乘的结果加起来
通俗解释
想象你算"1个苹果 + 2个苹果×1(2!) + 3个苹果×2×1(3!)......",每算一个数的阶乘(内层循环),就把它加到总和里(外层循环控制加几个数)。
简化代码(C++)
cpp
#include <iostream>
using namespace std;
int main() {
int n = 3; // 求到3!
int sum = 0;
for (int i = 1; i <= n; i++) { // 外层:加第i个阶乘
int fact = 1; // 每个阶乘的初始值
for (int j = 1; j <= i; j++) { // 内层:算i!
fact *= j;
}
sum += fact; // 累加阶乘
}
cout << "1!+2!+...+" << n << "! = " << sum << endl;
return 0;
}
答案
n=3时输出9;n=5时输出153(1+2+6+24+120)。
例4.13 打印三角形(*组成)
问题:打印n行正三角形(比如n=3时):
*
**
***
知识点
- 外层循环:控制行数(
i从1到n) - 内层循环:控制每行的数量(
j从1到i,打印i个)
通俗理解
想象画三角形:第1行画1个*,第2行画2个*......第i行画i个*。外层选"第几行",内层在这一行画"几个*"。
简化代码
cpp
#include <iostream>
using namespace std;
int main() {
int n = 3;
for (int i = 1; i <= n; i++) { // 外层:第i行
for (int j = 1; j <= i; j++) { // 内层:画i个*
cout << "*";
}
cout << endl; // 换行
}
return 0;
}
答案
n=3时输出如上三角形;n=5时输出5行,每行依次1-5个*。
例4.14 百钱买百鸡
问题:100文买100只鸡,公鸡5文/只,母鸡3文/只,小鸡1文3只。求所有买法。
知识点
- 外层循环:公鸡数量
x(0≤x≤20,5×20=100) - 内层循环:母鸡数量
y(0≤y≤33,3×33=99) - 小鸡数量
z=100-x-y,需满足:5x+3y + z/3=100且z能被3整除(小鸡不能买半只)
通俗理解
想象买鸡:先试买0只公鸡+0只母鸡,算小鸡数量;再试0只公鸡+1只母鸡......一个个试(双重循环),找到所有符合条件的组合。
简化代码
cpp
#include <iostream>
using namespace std;
int main() {
for (int x = 0; x <= 20; x++) { // 公鸡最多20只
for (int y = 0; y <= 33; y++) { // 母鸡最多33只
int z = 100 - x - y;
if (z % 3 == 0 && 5*x + 3*y + z/3 == 100) {
cout << "公鸡:" << x << ",母鸡:" << y << ",小鸡:" << z << endl;
}
}
}
return 0;
}
答案
共4种买法:
- 公鸡0,母鸡25,小鸡75
- 公鸡4,母鸡18,小鸡78
- 公鸡8,母鸡11,小鸡81
- 公鸡12,母鸡4,小鸡84
例4.15 水仙花数(三位数)
问题:找三位数中"每个数位的立方和等于自身"的数(比如153=1³+5³+3³)。
知识点
- 外层循环:遍历100~999的三位数(
i从100到999) - 内层操作:分解
i的百位、十位、个位(比如153→百位1,十位5,个位3) - 判断:
百位³ + 十位³ + 个位³ == i?
通俗理解
检查每个三位数,拆成"百、十、个"三个数字,算它们的立方和(比如1³=1,5³=125,3³=27,和为153),如果和原数一样,就是水仙花数。
简化代码
cpp
#include <iostream>
using namespace std;
int main() {
for (int i = 100; i <= 999; i++) {
int a = i / 100; // 百位(153/100=1)
int b = (i / 10) % 10; // 十位(153/10=15→15%10=5)
int c = i % 10; // 个位(153%10=3)
if (a*a*a + b*b*b + c*c*c == i) {
cout << i << " 是水仙花数" << endl;
}
}
return 0;
}
答案
三位数中的水仙花数:153、370、371、407。
例4.16 100以内素数
问题:找100以内的素数(只能被1和自身整除的数,比如2、3、5)。
知识点
- 外层循环:遍历2~100的数(
i从2到100) - 内层循环:判断
i是否能被2~√i的数整除(若都不能,是素数)
通俗解释
检查每个数(从2开始),看看它能不能被比它小的数整除(比如5:2不能整除,3不能,4不能→是素数)。内层循环是"试除",外层循环是"检查哪个数"。
简化代码
cpp
#include <iostream>
#include <cmath>
using namespace std;
int main() {
for (int i = 2; i <= 100; i++) {
bool isPrime = true; // 先假设是素数
for (int j = 2; j <= sqrt(i); j++) {
if (i % j == 0) { // 能整除,不是素数
isPrime = false;
break; // 跳出内层循环
}
}
if (isPrime) cout << i << " ";
}
return 0;
}
答案
100以内素数:2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97。
例4.17 四位完全平方数
问题:找四位数中的完全平方数(比如1024=32²)。
知识点
- 外层循环:遍历32~99的数(31²=961是三位数,99²=9801是四位数)
- 计算平方:
k=i×i,输出所有四位数的平方。
通俗解释
算每个数的平方,看看是不是四位数(比如32²=1024,是;99²=9801,是),把这些数找出来。
简化代码
cpp
#include <iostream>
using namespace std;
int main() {
for (int i = 32; i <= 99; i++) {
cout << i*i << " ";
}
return 0;
}
答案
部分结果:1024(32²)、1089(33²)、1156(34²)......9801(99²)。
例4.18 分解质因数
问题:把数分解成质数相乘(比如12=2×2×3)。
知识点
- 外层循环:从2开始试除(最小质数是2)
- 内层循环:若能整除,记录质数,继续用商试除(直到商为1)
通俗解释
把数"拆成小质数的乘积":比如12→先除以2(能整除,记录2),得到6;再除以2(能整除,记录2),得到3;再除以2(不能),换3(能整除,记录3),结束。
简化代码(以12为例)
cpp
#include <iostream>
using namespace std;
int main() {
int n = 12;
cout << n << " = ";
for (int i = 2; i <= n; i++) {
while (n % i == 0) {
cout << i;
n /= i;
if (n != 1) cout << "×";
}
}
cout << endl;
return 0;
}
答案
12=2×2×3;18=2×3×3;25=5×5。
三、循环嵌套技巧
- 先想外层循环控制什么 (比如行数、范围),再想内层循环做什么(比如每行操作、试除)。
- 用"套娃"比喻理解嵌套,外层每走1步,内层走完整轮。