进阶 · 嵌套循环
星号金字塔
打印 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 星。空格也算 — 判题会比。
你的解答
「运行我的输入」用的自定义输入
判题在浏览器本地运行。死循环会在 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;
}