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++)
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=100z能被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. 先想外层循环控制什么 (比如行数、范围),再想内层循环做什么(比如每行操作、试除)。
  2. 用"套娃"比喻理解嵌套,外层每走1步,内层走完整轮。
相关推荐
十五年专注C++开发6 小时前
Qt实现带多选功能的组合复选框
开发语言·c++·qt·qcombobox
软泡芙6 小时前
【C# 】各种等待大全:从入门到精通
开发语言·c#·log4j
郭源潮16 小时前
从8k嘈杂到16k清晰,我是如何使用RNNoise+libresample构建音频降噪管道的?
c++·音视频·实时音视频
@小码农6 小时前
2026年信息素养大赛【星火征途】图形化编程复赛和决赛模拟题B
开发语言·数据结构·c++·算法
JMchen1236 小时前
NDK新趋势——Rust与Android深度集成实战
android·开发语言·rust·jni·内存安全·android ndk·移动端性能
代码羊羊6 小时前
Rust 闭包全方位详解:语法、捕获规则、Fn 三特征、返回值实战
开发语言·后端·rust
tjl521314_216 小时前
02C++ 静态变量与链接性
java·jvm·c++
(Charon)6 小时前
【C++/Qt】Qt 实现 WebSocket 测试工具:连接、消息收发与通信日志
c++·qt·websocket