top1编程
← 返回题目
题解

【入门】蝴蝶结

1 条题解

  • 0
    @ 2026-7-31 10:32:04

    解题思路

    题目要求打印 n 行的蝴蝶结图形。拿 n=9 来看:

    *****
    ****
    ***
    **
    *
    **
    ***
    ****
    *****
    

    你会发现星号数量先变少再变多:

    • 第 1 行 5 个星,第 2 行 4 个……中间行 1 个星
    • 然后又从 2 个、3 个……回到 5 个

    规律:每行星数 = 这一行到中间行的距离 + 1。

    n=9 时中间行是第 5 行(行号从 0 算),距离:

    • 第 1 行距离 4 → 4+1=5 个星
    • 第 2 行距离 3 → 3+1=4 个星
    • ……
    • 中间行距离 0 → 0+1=1 个星
    • 下面又对称变大

    用 i 表示行号,距离 d = |i - n/2|,星数就是 d+1。

    参考代码

    #include <iostream>
    using namespace std;
    
    int main() {
        int n;
        cin >> n;
    
        int mid = n / 2;  // 中间行行号
        for (int i = 0; i < n; i++) {
            // 星数 = 到中间行的距离 + 1
            int d = i - mid;
            if (d < 0) d = -d;
            for (int j = 0; j < d + 1; j++) cout << '*';
            cout << endl;
        }
        return 0;
    }
    

    复杂度分析

    • 时间复杂度:O(N²),每行输出 d+1 个星
    • 空间复杂度:O(1)
    • 1