进阶 · 嵌套循环

星号金字塔

打印 N 层居中的星号金字塔。图案打印让循环不再抽象 — 差一错误你能看见。

一句话答案第 i 行是 N−i 个空格加上 2i−1 个星号,用两层循环打印 —— 前导空格也算在期望输出里,顶到左边会被判错。

题目

输入: 一个整数 N(1 ≤ N ≤ 20)。

输出: N 层金字塔。第 i 行(从 1 数)有 N − i 个前导空格,后跟 2i − 1 个星号。

样例:N = 3:

  *
 ***
*****

第 1 行:2 空格 + 1 星。第 2 行:1 空格 + 3 星。第 3 行:0 空格 + 5 星。空格也算 — 判题会比。

你的解答

main.cpp — 你的解答
「运行我的输入」用的自定义输入

判题在浏览器本地运行。死循环会在 3 秒后被自动中断 —— 但还是确保每个循环都有出口。代码随打随存。

卡住了?提示

提示 1 — 先想行,再想列

一个外层 for 走行 i = 1…N。每行两个内层循环:先打 n - i 个空格,再打 2*i - 1 个星号,然后 cout << endl;。嵌套循环 = 每层只管一件事。

提示 2 — 用 N=1 和 N=2 调试

先跑小例子。N=1 对了 N=2 歪了,就是空格数差一 — 公式 n - i 和 2*i - 1 是整道题,从样例里数出来,别靠猜。

题解(先自己试试!)
#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        for (int s = 0; s < n - i; s++) cout << " ";
        for (int k = 0; k < 2 * i - 1; k++) cout << "*";
        cout << endl;
    }
    return 0;
}

过了之后玩变体:直角三角形(删空格循环)、倒金字塔(i 倒着数)、空心金字塔(内层加 if/else,只在边上打星)。互联网上一半的图案题都是这三个骨架。下一题:阶乘。

深度解析

为什么这样做对

每行两个计数器——先空格后星号——教会你一条规则:嵌套循环的数量等于输出维度的数量。

代价

要打印 O(n²) 个字符。输出本身就是平方级,任何算法都躲不掉。

常见错法

  • 前导空格是逐字节比对的——多一个整行就错。行尾空格本站会去掉(真实 OJ 通常不会)。
  • 背下 2*i - 1 能过,但一改基数就错。每次从行号把数量推出来。

下一步

同样的嵌套,换成数字输出:乘法表。

记住这两句

  • 输出有几个维度,就写几层循环。
  • 前导空格必须留,行尾空格必须删。
🐞 这段是错的 —— 点开,亲手让它挂一次

每行前导空格多了一个

#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n - i + 1; j++) cout << " ";
        for (int j = 1; j <= 2 * i - 1; j++) cout << "*";
        cout << endl;
    }
    return 0;
}