#3806. GESP1MONI02J1

GESP1MONI02J1

GESP1MONI02J1 字符菱形(25 分)

题目描述

给定一个奇数 nn,请用 * 画出一个菱形图案:它一共有 nn 行,最宽的一行(正中间那一行)恰好有 nn 个星号,上下对称。

例如 n=5n = 5 时,图案如下(每行前面的空格也必须输出):

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

请你编写程序,对任意给定的奇数 nn 输出对应的菱形。

输入格式

输入一行,包含一个奇数 nn。

输出格式

输出 nn 行,第 ii 行由若干个空格和若干个 * 组成,构成一个菱形。

每行的星号后面不要输出多余的空格,每行末尾都要换行。

样例 #1

样例输入 #1

5

样例输出 #1

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

样例解释

最宽的是第 3 行,有 5 个星号;第 1 行与第 5 行各先输出 2 个空格再输出 1 个星号,第 2 行与第 4 行各先输出 1 个空格再输出 3 个星号。

样例 #2

样例输入 #2

1

样例输出 #2

*

样例解释

只有一个星号,就是一个 1 行、最宽一行 1 个星号的菱形。

数据范围

  • 1≤n≤991 \leq n \leq 99
  • nn 为奇数

本题共 10 个测试点,每个测试点 2.5 分,其中测试点 1、2 为题目给出的样例。

提示

关键是找出“第 ii 行要输出多少个空格、多少个星号”的规律。设最宽的一行是第 mid=n/2+1mid = n / 2 + 1 行(整数除法):

  1. 用外层循环 for (int i = 1; i <= n; i++) 表示当前是第 i 行;

  2. 计算这一行前面的空格数 blank:

    • 上半部分(i≤midi \leq mid):blank = mid - i
    • 下半部分(i>midi > mid):blank = i - mid

    也可以合起来写:blank = (i <= mid) ? (mid - i) : (i - mid);(这就是“到第 midmid 行的距离”);

  3. 这一行的星号数 star = n - 2 * blank——菱形越靠近中间,空格越少、星号越多;

  4. 内层用两个并列的循环:先输出 blank 个空格,再输出 star 个 *,最后 cout << '\n'; 换行。

常见错误:把空格输出在星号后面(图形会“贴左”),或者漏掉每行末尾的换行。注意本题只需要两个并列的内层循环,不需要嵌套三层循环。