📘循环嵌套

2026-09-08
⭐⭐ GESP 4级

📖概念讲解

循环嵌套就是循环里面套循环,属于 GESP 4 级基础必考。外层每执行一次,内层就完整跑完一轮。两层嵌套的时间复杂度是 O(n²),三层就是 O(n³),写的时候要特别注意别掉进"超时陷阱"。

核心要搞清楚两件事:

⚡ 易错提醒:for 循环里 i 用完就出了作用域,但内层循环如果也声明 i,会遮蔽(shadow)外层的 i,导致外层变量值被覆盖,结果全错!

💻代码示例:打印九九乘法表

1#include <iostream>
2using namespace std;
3
4int main() {
5 for(int i = 1; i <= 9; i++) { // 外层控制行数,i从1到9
6 for(int j = 1; j <= i; j++) { // 内层控制列数,j只到i(上三角)
7 cout << j << "*" << i << "=" << i*j;
8 if(j < i) cout << "\t"; // 不是最后一个就加制表符
9 }
10 cout << endl; // 每行结束换行
11 }
12 return 0;
13}
14// 输出:1*1=1
15// 1*2=2 2*2=4
16// 1*3=3 2*3=6 3*3=9 ...(九九乘法表上三角)

💡 注意:内层循环条件是 j <= i 而不是 j <= 9,这样才打印出上三角形状。

🧩互动小测

题目 1:两层嵌套 for 循环,外层 n 次、内层 m 次,总共执行内层循环体多少次?

题目 2:下面代码打印了多少个星号?

for(int i=1; i<=5; i++)
  for(int j=1; j<=i; j++)
    cout << "*";

题目 3:三层嵌套循环,每层都跑 n 次,时间复杂度是多少?

🏋️动手练一练

📝 编程练习:打印空心菱形

输入一个正整数 n(n 为奇数),打印一个高度为 n 的空心菱形。

示例:n=5 时输出:
  *
 * *
*   *
 * *
  *

提示:①先算每行的空格数和星号位置;②空心意味着只有每行的第一个和最后一个星号需要打印,中间是空格;③考虑 n=1 的边界情况。
参考答案:
#include <iostream>
using namespace std;
int main() {
    int n; cin >> n;              // 读入奇数n
    int mid = n / 2;             // 中间行索引(从0开始)
    for(int i = 0; i < n; i++) {
        int dist = abs(i - mid);  // 当前行到中间行的距离
        int spaces = dist;        // 前导空格数
        int stars = mid - dist;   // 星号之间的间隔(空心:只打首尾)
        cout << string(spaces, ' ');
        cout << '*';              // 第一颗星
        if(stars > 0) {
            cout << string(stars * 2 - 1, ' ');
            cout << '*';          // 最后一颗星(空心)
        }
        cout << endl;
    }
    return 0;
}

要点:关键是理解 dist 决定空格数,stars 决定两颗星之间的空格数。上半部分 dist 递减、下半部分 dist 递增,用 abs() 统一处理。n=1 时 stars=0,只打一颗星,刚好符合边界。

📝易错点提醒

学完这个知识点后点一下