题解:学而思编程 打印金字塔图案
【题目来源】
学而思编程:打印金字塔图案
【题目描述】
给定一个整数 \(n\),请你打印一个具有 \(n\) 层结构的金字塔图案。
例如当 \(n = 2\) 时的三角形金字塔图案如下:

当 \(n = 3\) 时的三角形金字塔图案如下:

【输入】
一行一个整数 \(n\)。
【输出】
输出对应的金字塔图案。
【输入样例】
4
【输出样例】
/\
/__\
/\ /\
/__\/__\
/\ /\ /\
/__\/__\/__\
/\ /\ /\ /\
/__\/__\/__\/__\
【核心思想】
-
问题分析:给定整数 \(n\),打印 \(n\) 层金字塔图案。每层包含上下两行:上行是
/\重复 \(i\) 次,下行是/__\重复 \(i\) 次,且随着层数增加,前导空格减少。这是一个嵌套循环 + 格式控制问题,关键在于计算每行的前导空格数和重复单元数。 -
算法选择:
- 外层循环控制层数:遍历 \(i\) 从 \(1\) 到 \(n\)
- 内层循环控制空格与图案:每层打印两行,分别计算前导空格和重复单元
-
关键步骤:
- 初始化:读取 \(n\)
- 逐层打印(遍历 \(i\) 从 \(1\) 到 \(n\)):
- 打印上行:
- 前导空格:
2 * (n - i)个空格 - 图案单元:
" /\\ "重复 \(i\) 次 - 换行
- 前导空格:
- 打印下行:
- 前导空格:
2 * (n - i)个空格 - 图案单元:
"/__\\"重复 \(i\) 次 - 换行
- 前导空格:
- 打印上行:
-
时间/空间复杂度:
- 时间复杂度:\(O(n^2)\),共 \(2n\) 行,每行 \(O(n)\) 字符
- 空间复杂度:\(O(1)\),仅输出,无额外存储
-
格式控制的核心思想:
- 前导空格递减:第 \(i\) 层的前导空格为
2*(n-i),随着 \(i\) 增大,空格减少,形成金字塔的缩进效果 - 重复单元递增:第 \(i\) 层有 \(i\) 个三角形单元,体现金字塔的宽度增长
- 上下行配对:每层包含尖顶行(
/\)和底边行(/__\),共同构成完整三角形 - 转义字符处理:
\在 C++ 字符串中需转义为\\ - 适用于"规则图案打印"类问题,通过分析图案规律,用循环控制空格和重复单元即可实现
- 前导空格递减:第 \(i\) 层的前导空格为
【算法标签】
模拟
【代码详解】
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n; // 层数
cin >> n;
for (int i = 1; i <= n; i++) // 第i层
{
// 打印前导空格
for (int j = 1; j <= 2 * (n - i); j++)
{
cout << " ";
}
// 打印上层三角形
for (int j = 1; j <= i; j++)
{
cout << " /\\ ";
}
cout << endl;
// 打印下一行的前导空格
for (int j = 1; j <= 2 * (n - i); j++)
{
cout << " ";
}
// 打印下层三角形
for (int j = 1; j <= i; j++)
{
cout << "/__\\";
}
cout << endl;
}
return 0;
}
【运行结果】
4
/\
/__\
/\ /\
/__\/__\
/\ /\ /\
/__\/__\/__\
/\ /\ /\ /\
/__\/__\/__\/__\
浙公网安备 33010602011771号