#3806. GESP1MONI02J1
GESP1MONI02J1
GESP1MONI02J1 字符菱形(25 分)
题目描述
给定一个奇数 ,请用 * 画出一个菱形图案:它一共有 行,最宽的一行(正中间那一行)恰好有 个星号,上下对称。
例如 时,图案如下(每行前面的空格也必须输出):
*
***
*****
***
*
请你编写程序,对任意给定的奇数 输出对应的菱形。
输入格式
输入一行,包含一个奇数 。
输出格式
输出 行,第 行由若干个空格和若干个 * 组成,构成一个菱形。
每行的星号后面不要输出多余的空格,每行末尾都要换行。
样例 #1
样例输入 #1
5
样例输出 #1
*
***
*****
***
*
样例解释
最宽的是第 3 行,有 5 个星号;第 1 行与第 5 行各先输出 2 个空格再输出 1 个星号,第 2 行与第 4 行各先输出 1 个空格再输出 3 个星号。
样例 #2
样例输入 #2
1
样例输出 #2
*
样例解释
只有一个星号,就是一个 1 行、最宽一行 1 个星号的菱形。
数据范围
- 为奇数
本题共 10 个测试点,每个测试点 2.5 分,其中测试点 1、2 为题目给出的样例。
提示
关键是找出“第 行要输出多少个空格、多少个星号”的规律。设最宽的一行是第 行(整数除法):
-
用外层循环
for (int i = 1; i <= n; i++)表示当前是第i行; -
计算这一行前面的空格数
blank:- 上半部分():
blank = mid - i - 下半部分():
blank = i - mid
也可以合起来写:
blank = (i <= mid) ? (mid - i) : (i - mid);(这就是“到第 行的距离”); - 上半部分():
-
这一行的星号数
star = n - 2 * blank——菱形越靠近中间,空格越少、星号越多; -
内层用两个并列的循环:先输出
blank个空格,再输出star个*,最后cout << '\n';换行。
常见错误:把空格输出在星号后面(图形会“贴左”),或者漏掉每行末尾的换行。注意本题只需要两个并列的内层循环,不需要嵌套三层循环。