C 循环嵌套·笔记 核心概念循环嵌套就是“一个循环里面再套一个循环”。外面的循环跑一次里面的循环就要跑整整一圈。️ 1. 认识循环嵌套操场跑步与圈数想象一下学校的操场外层循环代表“第几天”训练比如周一到周五循环5次。内层循环代表“当天跑多少圈”比如每天跑4圈循环4次。代码结构for(intday1;day5;day){// 外层5天cout今天是第day天开始跑步endl;for(intlap1;lap4;lap){// 内层4圈cout跑了第lap圈endl;}cout今天跑完了休息endl;}注意内层循环要缩进空格这样看起来像房子里套着小房子逻辑更清晰 2. 图形打印题画矩形与三角形 (对应文档题目 1097, 2027)图形题是循环嵌套的“入门砖”。题目画矩形 (1097)任务输入高h和宽w用*画一个实心矩形。思路外层循环 (控制行)跑h次有多少行。内层循环 (控制列)每次跑w次每行有多少个星号。换行内层循环跑完一次一行画完了记得cout endl;换行。#includeiostreamusingnamespacestd;intmain(){inth,w;cinhw;for(inti1;ih;i){// 外层行for(intj1;jw;j){// 内层列cout*;// 打印星号不换行}coutendl;// 一行打印结束换行}return0;}题目三角形 (2027)变通如果是直角三角形比如第i行打印i个星号内层循环的上限不再是固定的w而是变化的i。for(inti1;in;i){// i从1到nfor(intj1;ji;j){// j从1到icout*;}coutendl;} 3. 枚举查找题百钱买百鸡与找素数 (对应文档题目 2028, 2030, 1099)当一个问题有多个未知数或者需要“一个一个试”时我们用循环嵌套来当“超级侦探”。题目百钱买百鸡 (2028)题目意思公鸡5块钱一只母鸡3块钱一只小鸡1块钱三只。用100块钱买100只鸡问怎么买思路这有三个未知数公鸡数x、母鸡数y、小鸡数z。我们可以用三重循环把所有可能的情况都试一遍优化因为钱和鸡的数量都有限我们可以根据“总价不超过100”来缩小循环范围。#includeiostreamusingnamespacestd;intmain(){// x:公鸡, y:母鸡, z:小鸡for(intx0;x20;x){// 公鸡最多买20只100/5for(inty0;y33;y){// 母鸡最多买33只intz100-x-y;// 小鸡数量总数是100只if(z%305*x3*yz/360){// 检查小鸡数量是否合法且总价是否为100coutx y zendl;}}}return0;}题目找素数 (2030) / 第n小的质数 (1099)思路判断一个数i是不是素数需要拿从2到i-1的所有数去试除。外层循环遍历从2到n的所有数字。内层循环尝试用2到sqrt(i)或者i-1去整除i。#includeiostream#includecmathusingnamespacestd;intmain(){intm,n;cinmn;for(intim;in;i){// 遍历范围内的每个数boolisPrimetrue;// 假设i是素数for(intj2;jsqrt(i);j){// 尝试除以jif(i%j0){// 如果能整除isPrimefalse;// 说明不是素数break;// 跳出内层循环不用再试了}}if(isPrimei1){// 注意1不是素数coutiendl;}}return0;} 4. 数字处理题水仙花数与分解质因数 (对应文档题目 2029, 2032, 1098)这类题目需要把一个数“拆开”或者“分解”。题目水仙花数 (2029)定义一个三位数它的各位数字的立方和等于它本身例如1353331531^35^33^3153135333153。技巧如何拆分数字个位 num % 10十位 (num / 10) % 10百位 num / 100#includeiostreamusingnamespacestd;intmain(){intn;cinn;for(inti100;in;i){// 遍历100到nintgei%10;intshi(i/10)%10;intbaii/100;if(ge*ge*geshi*shi*shibai*bai*baii){coutiendl;}}return0;}题目分解质因数 (2032, 1098)思路拿一个数n从最小的质数2开始试除。只要n能被i整除就把i打印出来并把n除以i。如果不能整除i就加1继续试。直到i大于n为止。#includeiostreamusingnamespacestd;intmain(){intn;cinn;coutn;inttempn;boolfirsttrue;// 控制输出格式第一个数前面不加*for(inti2;itemp;){if(n%i0){if(!first)cout*;couti;nn/i;// n变小了firstfalse;}else{i;// 试下一个数}}return0;} 5. 高效技巧累加与累乘 (对应文档题目 2033, 1091, 1092)有时候我们需要计算1! 2! 3! ... n!。错误做法写两个嵌套循环内层每次都从头算1*2*3*...*i。这样太慢了聪明做法利用上一次的结果1! 12! 1! * 23! 2! * 3所以我们可以在外层循环里维护一个factorial变量每次乘以当前的i即可。#includeiostreamusingnamespacestd;intmain(){intn;cinn;longlongsum0;// 存总和longlongfactorial1;// 存当前的阶乘值for(inti1;in;i){factorialfactorial*i;// 计算i的阶乘sumsumfactorial;// 累加到总和}coutsumendl;return0;} 总结循环嵌套的“三大家族”题型典型题目核心思路图形打印画矩形、三角形外层控制行内层控制列记得换行。枚举查找百钱买百鸡、找素数把所有可能的情况都试一遍暴力美学找到符合条件的就输出。数字处理水仙花数、分解质因数利用%和/拆分数字或者利用循环试除。提示循环嵌套就像俄罗斯套娃一层包着一层。做题时先想清楚“外层要干什么”再想清楚“内层要干什么”。多画图、多调试
C++循环嵌套章节信奥一本通练习题
C 循环嵌套·笔记 核心概念循环嵌套就是“一个循环里面再套一个循环”。外面的循环跑一次里面的循环就要跑整整一圈。️ 1. 认识循环嵌套操场跑步与圈数想象一下学校的操场外层循环代表“第几天”训练比如周一到周五循环5次。内层循环代表“当天跑多少圈”比如每天跑4圈循环4次。代码结构for(intday1;day5;day){// 外层5天cout今天是第day天开始跑步endl;for(intlap1;lap4;lap){// 内层4圈cout跑了第lap圈endl;}cout今天跑完了休息endl;}注意内层循环要缩进空格这样看起来像房子里套着小房子逻辑更清晰 2. 图形打印题画矩形与三角形 (对应文档题目 1097, 2027)图形题是循环嵌套的“入门砖”。题目画矩形 (1097)任务输入高h和宽w用*画一个实心矩形。思路外层循环 (控制行)跑h次有多少行。内层循环 (控制列)每次跑w次每行有多少个星号。换行内层循环跑完一次一行画完了记得cout endl;换行。#includeiostreamusingnamespacestd;intmain(){inth,w;cinhw;for(inti1;ih;i){// 外层行for(intj1;jw;j){// 内层列cout*;// 打印星号不换行}coutendl;// 一行打印结束换行}return0;}题目三角形 (2027)变通如果是直角三角形比如第i行打印i个星号内层循环的上限不再是固定的w而是变化的i。for(inti1;in;i){// i从1到nfor(intj1;ji;j){// j从1到icout*;}coutendl;} 3. 枚举查找题百钱买百鸡与找素数 (对应文档题目 2028, 2030, 1099)当一个问题有多个未知数或者需要“一个一个试”时我们用循环嵌套来当“超级侦探”。题目百钱买百鸡 (2028)题目意思公鸡5块钱一只母鸡3块钱一只小鸡1块钱三只。用100块钱买100只鸡问怎么买思路这有三个未知数公鸡数x、母鸡数y、小鸡数z。我们可以用三重循环把所有可能的情况都试一遍优化因为钱和鸡的数量都有限我们可以根据“总价不超过100”来缩小循环范围。#includeiostreamusingnamespacestd;intmain(){// x:公鸡, y:母鸡, z:小鸡for(intx0;x20;x){// 公鸡最多买20只100/5for(inty0;y33;y){// 母鸡最多买33只intz100-x-y;// 小鸡数量总数是100只if(z%305*x3*yz/360){// 检查小鸡数量是否合法且总价是否为100coutx y zendl;}}}return0;}题目找素数 (2030) / 第n小的质数 (1099)思路判断一个数i是不是素数需要拿从2到i-1的所有数去试除。外层循环遍历从2到n的所有数字。内层循环尝试用2到sqrt(i)或者i-1去整除i。#includeiostream#includecmathusingnamespacestd;intmain(){intm,n;cinmn;for(intim;in;i){// 遍历范围内的每个数boolisPrimetrue;// 假设i是素数for(intj2;jsqrt(i);j){// 尝试除以jif(i%j0){// 如果能整除isPrimefalse;// 说明不是素数break;// 跳出内层循环不用再试了}}if(isPrimei1){// 注意1不是素数coutiendl;}}return0;} 4. 数字处理题水仙花数与分解质因数 (对应文档题目 2029, 2032, 1098)这类题目需要把一个数“拆开”或者“分解”。题目水仙花数 (2029)定义一个三位数它的各位数字的立方和等于它本身例如1353331531^35^33^3153135333153。技巧如何拆分数字个位 num % 10十位 (num / 10) % 10百位 num / 100#includeiostreamusingnamespacestd;intmain(){intn;cinn;for(inti100;in;i){// 遍历100到nintgei%10;intshi(i/10)%10;intbaii/100;if(ge*ge*geshi*shi*shibai*bai*baii){coutiendl;}}return0;}题目分解质因数 (2032, 1098)思路拿一个数n从最小的质数2开始试除。只要n能被i整除就把i打印出来并把n除以i。如果不能整除i就加1继续试。直到i大于n为止。#includeiostreamusingnamespacestd;intmain(){intn;cinn;coutn;inttempn;boolfirsttrue;// 控制输出格式第一个数前面不加*for(inti2;itemp;){if(n%i0){if(!first)cout*;couti;nn/i;// n变小了firstfalse;}else{i;// 试下一个数}}return0;} 5. 高效技巧累加与累乘 (对应文档题目 2033, 1091, 1092)有时候我们需要计算1! 2! 3! ... n!。错误做法写两个嵌套循环内层每次都从头算1*2*3*...*i。这样太慢了聪明做法利用上一次的结果1! 12! 1! * 23! 2! * 3所以我们可以在外层循环里维护一个factorial变量每次乘以当前的i即可。#includeiostreamusingnamespacestd;intmain(){intn;cinn;longlongsum0;// 存总和longlongfactorial1;// 存当前的阶乘值for(inti1;in;i){factorialfactorial*i;// 计算i的阶乘sumsumfactorial;// 累加到总和}coutsumendl;return0;} 总结循环嵌套的“三大家族”题型典型题目核心思路图形打印画矩形、三角形外层控制行内层控制列记得换行。枚举查找百钱买百鸡、找素数把所有可能的情况都试一遍暴力美学找到符合条件的就输出。数字处理水仙花数、分解质因数利用%和/拆分数字或者利用循环试除。提示循环嵌套就像俄罗斯套娃一层包着一层。做题时先想清楚“外层要干什么”再想清楚“内层要干什么”。多画图、多调试