1 条题解
-
0
当然可以!以下是对你提供的图片内容的详细分析和解读:
📄 图片内容概述
这是一道编程题目,标题为 【入门】沙漏,属于基础编程练习题,主要考察 嵌套循环 的使用能力。
🔍 一、题目描述(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
- 上传者
粤公网安备44195502000178号