c++信奥循环嵌套讲解
循环嵌套笔记
------彭彭老师一、循环嵌套基础:什么是“套娃循环”?
就像“俄罗斯套娃”,一个循环里藏着另一个循环:
- 外层循环:控制“大步骤”(比如做几轮)
- 内层循环:控制“小步骤”(比如每轮重复做什么)
核心逻辑:外层循环每走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++)
#include<iostream>usingnamespacestd;intmain(){intn=3;// 求到3!intsum=0;for(inti=1;i<=n;i++){// 外层:加第i个阶乘intfact=1;// 每个阶乘的初始值for(intj=1;j<=i;j++){// 内层:算i!fact*=j;}sum+=fact;// 累加阶乘}cout<<"1!+2!+...+"<<n<<"! = "<<sum<<endl;return0;}答案
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个*。外层选“第几行”,内层在这一行画“几个*”。
简化代码
#include<iostream>usingnamespacestd;intmain(){intn=3;for(inti=1;i<=n;i++){// 外层:第i行for(intj=1;j<=i;j++){// 内层:画i个*cout<<"*";}cout<<endl;// 换行}return0;}答案
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只母鸡……一个个试(双重循环),找到所有符合条件的组合。
简化代码
#include<iostream>usingnamespacestd;intmain(){for(intx=0;x<=20;x++){// 公鸡最多20只for(inty=0;y<=33;y++){// 母鸡最多33只intz=100-x-y;if(z%3==0&&5*x+3*y+z/3==100){cout<<"公鸡:"<<x<<",母鸡:"<<y<<",小鸡:"<<z<<endl;}}}return0;}答案
共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),如果和原数一样,就是水仙花数。
简化代码
#include<iostream>usingnamespacestd;intmain(){for(inti=100;i<=999;i++){inta=i/100;// 百位(153/100=1)intb=(i/10)%10;// 十位(153/10=15→15%10=5)intc=i%10;// 个位(153%10=3)if(a*a*a+b*b*b+c*c*c==i){cout<<i<<" 是水仙花数"<<endl;}}return0;}答案
三位数中的水仙花数: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不能→是素数)。内层循环是“试除”,外层循环是“检查哪个数”。
简化代码
#include<iostream>#include<cmath>usingnamespacestd;intmain(){for(inti=2;i<=100;i++){boolisPrime=true;// 先假设是素数for(intj=2;j<=sqrt(i);j++){if(i%j==0){// 能整除,不是素数isPrime=false;break;// 跳出内层循环}}if(isPrime)cout<<i<<" ";}return0;}答案
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,是),把这些数找出来。
简化代码
#include<iostream>usingnamespacestd;intmain(){for(inti=32;i<=99;i++){cout<<i*i<<" ";}return0;}答案
部分结果: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为例)
#include<iostream>usingnamespacestd;intmain(){intn=12;cout<<n<<" = ";for(inti=2;i<=n;i++){while(n%i==0){cout<<i;n/=i;if(n!=1)cout<<"×";}}cout<<endl;return0;}答案
12=2×2×3;18=2×3×3;25=5×5。
三、循环嵌套技巧
- 先想外层循环控制什么(比如行数、范围),再想内层循环做什么(比如每行操作、试除)。
- 用“套娃”比喻理解嵌套,外层每走1步,内层走完整轮。
