题目

从标准输入读入一个正奇数 n,在控制台使用星号 * 和空格打印出边长对称的空心菱形图案。

输入格式:一行输入一个正奇数 n,表示菱形的总行数。

输出格式:输出 n 行字符图案,构成空心菱形。

数据范围与约定:3 ≤ n ≤ 29,保证 n 为奇数。

思路与算法

1. 上下对称划分
以中间行 mid = n / 2 为对称轴。前半部分(上半)行号逐渐展开,后半部分(下半)逐渐收缩。

2. 空心打印判定
每行只在左右边界位置打印 *,中间内部区域填充空格;顶点行(第 1 行和最后一行)只有一个星号。

完整程序

#include <stdio.h>

int main(void)
{
    int n;
    if (scanf("%d", &n) != 1 || n < 3 || n % 2 == 0) {
        return 1;
    }

    int mid = n / 2;
    // 逐行绘制空心菱形
    for (int i = 0; i < n; i++) {
        // 计算当前行到中心行 mid 的曼哈顿距离,即前导空格数
        int dist = i <= mid ? mid - i : i - mid;
        for (int s = 0; s < dist; s++) {
            putchar(' ');
        }
        // 仅在当前行的首尾边界打印星号,中间填充空格
        for (int j = dist; j < n - dist; j++) {
            if (j == dist || j == n - dist - 1) {
                putchar('*');
            } else {
                putchar(' ');
            }
        }
        putchar('\n');
    }
    return 0;
}

运行示例

输入:

5

输出:

*
 * *
*   *
 * *
  *