题解
【入门】打印n行的完整的蝴蝶结
1 条题解
-
0
解题思路
题目要求打印一个 n 行的完整蝴蝶结图形。拿 n=5 来看:
* * ** ** ****** ** ** * *图形分两半:
上半部分(含最宽的中间行):
- 第 1 行:左右各 1 个星,中间 4 个空格
- 第 2 行:左右各 2 个星,中间 2 个空格
- 第 3 行(中间):6 个星连在一起,没有空格
下半部分就是上半部分倒过来。
规律:
- 总共有 (n+1)/2 行上半部分,中间行最宽
- 第 i 行:左边 i 个星 + 中间 2×((n+1)/2 - i) 个空格 + 右边 i 个星
- 上半部分 i 从 1 增大到 (n+1)/2
- 下半部分 i 从 (n-1)/2 减小到 1
参考代码
#include <iostream> using namespace std; int main() { int n; cin >> n; // 上半部分(包括最宽的中间行) for (int i = 1; i <= (n + 1) / 2; i++) { for (int j = 1; j <= i; j++) cout << '*'; for (int j = 1; j <= 2 * ((n + 1) / 2 - i); j++) cout << ' '; for (int j = 1; j <= i; j++) cout << '*'; cout << endl; } // 下半部分(不包括中间行) for (int i = (n - 1) / 2; i >= 1; i--) { for (int j = 1; j <= i; j++) cout << '*'; for (int j = 1; j <= 2 * ((n + 1) / 2 - i); j++) cout << ' '; for (int j = 1; j <= i; j++) cout << '*'; cout << endl; } return 0; }复杂度分析
- 时间复杂度:O(N²),每行打印约 n 个字符
- 空间复杂度:O(1)
- 1