top1编程
← 返回题目
题解

【入门】打印n行的完整的蝴蝶结

1 条题解

  • 0
    @ 2026-7-31 11:33:20

    解题思路

    题目要求打印一个 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