源本科技 | 码上会

菱形图案打印

2026/01/26
7
0

题目

编写一个程序,打印出如下图案(菱形):

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

说明

该问题要求打印一个对称的菱形图案。为了实现这一点,我们可以将整个图形分为两部分来处理:上半部分和下半部分。

  • 上半部分(包括中间的最大行)是一个等腰三角形,每行的星号 (*) 数量从 1 开始逐渐增加到最大值。

  • 下半部分是从最大行开始递减的等腰三角形,每行的星号 (*) 数量逐渐减少回到 1。

每一行都由空格和星号组成,其中空格用于对齐以形成菱形形状。

分析步骤:

  1. 确定总行数,这里是 7 行(4 行递增 +3 行递减)。

  2. 上半部分(包括中点行)的每一行,前导空格数随着行数增加而减少,星号数则相应增加。

  3. 下半部分则是相反的过程,前导空格数增加,星号数减少。


👈点击左箭头查看答案(一定要在自己思考并实现后再看参考答案哦!)

规律分析

  • 对于第i行(从 1 开始计数),前导空格的数量是总行数/2 - i + 1,对于上半部分,当i=1时,前导空格最多;随着i的增大,前导空格逐渐减少。

  • 星号 (*) 的数量遵循2*i - 1的规律,即随着行数的增加而线性增加。

  • 在达到顶点后,下半部分的规律与上半部分对称,只是方向相反。


程序实现

public class Demo19 {
    public static void main(String[] args) {
        int size = 4; // 定义上半部分的行数,也是最大宽度的一半
        // 打印上半部分
        for (int i = 1; i <= size; i++) {
            // 打印前导空格
            for (int k = 1; k <= size - i; k++)
                System.out.print(" ");
            // 打印星号
            for (int j = 1; j <= 2 * i - 1; j++)
                System.out.print("*");
            System.out.println();
        }
        // 打印下半部分
        for (int i = size - 1; i >= 1; i--) {
            // 打印前导空格
            for (int k = 1; k <= size - i; k++)
                System.out.print(" ");
            // 打印星号
            for (int j = 1; j <= 2 * i - 1; j++)
                System.out.print("*");
            System.out.println();
        }
    }
}