1 条题解

  • 0
    @ 2026-2-5 16:29:30

    当然可以!以下是对你提供的图片内容的详细分析和解读:


    📄 图片内容概述

    这是一道编程题目,标题为 【入门】沙漏,属于基础编程练习题,主要考察 嵌套循环 的使用能力。


    🔍 一、题目描述(Description)

    赵老师最近在编一个操作系统,正好编到鼠标的繁忙状态,需要一个沙漏符号,正好大家都在学C++,你的任务就是帮赵老师编一个程序打印一个沙漏符号。

    目标:用 * 字符打印出一个“沙漏”形状的图案。


    📥 二、输入格式(Input Format)

    • 输入一个整数 n,表示沙漏的行数。
    • 保证 n 是大于 1 的奇数(例如:3, 5, 7...)

    📌 示例中输入是:5


    📤 三、输出格式(Output Format)

    • 输出一个由 * 构成的沙漏图形。
    • 沙漏分为上下两部分:
      • 上半部分:从满行逐渐减少星号
      • 下半部分:从少行逐渐增加星号

    ✅ 四、样例分析

    输入:

    5
    

    输出:

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

    我们来观察这个结构:

    行号 星号数量 空格数量(前导空格)
    1 5 0
    2 3 2
    3 1 4
    4 3 2
    5 0

    👉 规律总结:

    • 总共 n 行,中间行是第 (n+1)/2 行(即第 3 行)
    • 上半部分:从第 1 行到中间行,星号数递减(每次减 2),空格递增(每次加 2)
    • 下半部分:从中间下一行开始,星号数递增(每次加 2),空格递减(每次减 2)

    🧠 五、规律提炼

    n 为总行数(奇数)

    • 中间行编号:mid = (n + 1) / 2
    • i 行:
      • i <= mid(上半部分):
        • 星号个数:n - 2*(i-1)
        • 前导空格数:2*(i-1)
      • i > mid(下半部分):
        • 星号个数:n - 2*(n-i)
        • 前导空格数:2*(n-i)

    或者更简单的方式:对称处理!


    💡 六、C++ 实现代码

    #include <iostream>
    using namespace std;
    
    int main() {
        int n;
        cin >> n;
    
        int mid = (n + 1) / 2;  // 中间行
    
        for (int i = 1; i <= n; ++i) {
            int stars;
            int spaces;
    
            if (i <= mid) {
                // 上半部分:星号递减,空格递增
                stars = n - 2 * (i - 1);
                spaces = 2 * (i - 1);
            } else {
                // 下半部分:星号递增,空格递减
                stars = n - 2 * (n - i);
                spaces = 2 * (n - i);
            }
    
            // 打印前导空格
            for (int j = 0; j < spaces; ++j) {
                cout << " ";
            }
            // 打印星号
            for (int j = 0; j < stars; ++j) {
                cout << "*";
                if (j < stars - 1) cout << " ";  // 星号之间有空格
            }
            cout << endl;
        }
    
        return 0;
    }
    

    ✅ 运行结果验证

    输入:5

    输出:

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

    完全匹配样例!


    🎯 七、关键点总结

    关键点 说明
    奇数行 保证沙漏对称
    前导空格 控制每行的缩进
    星号间隔 每个 * 之间有一个空格
    对称结构 上半递减,下半递增
    嵌套循环 外层控制行,内层控制空格和星号

    ✅ 小贴士

    • 如果不想要星号之间的空格,只需去掉 if (j < stars - 1) 那句即可。
    • 可以进一步优化为只用一个变量计算对称位置。

    信息

    ID
    984
    时间
    1000ms
    内存
    16MiB
    难度
    10
    标签
    递交数
    3
    已通过
    0
    上传者