当前位置:首页 > 后端开发 > 正文

Java如何打印空心菱形?

使用Java打印空心菱形需将图形分为上下两部分:上半部分由递增的空格和星号组成,下半部分递减,关键逻辑是每行仅首尾输出星号,中间填充空格,通过循环控制空格数和星号位置实现空心效果。

以下是用Java打印空心菱形的详细方法,包含代码实现、逻辑解释和优化建议,适合不同基础的访客理解:

核心思路

空心菱形由对称的上下三角形组成,关键点在于:

Java如何打印空心菱形? 第1张

  1. 空格控制:定位每行起始位置
  2. 星号规则:首尾位置打印星号,中间用空格填充
  3. 对称分割:分上半部分(递增)和下半部分(递减)

完整代码实现

import java.util.Scanner; public class HollowDiamond { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("请输入菱形高度(奇数): "); int n = scanner.nextInt(); // 确保输入为奇数 if (n % 2 == 0) { System.out.println("输入应为奇数,自动转换为 " + (n + 1)); n += 1; } int mid = n / 2; // 中间行索引 // 打印上半部分(含中间行) for (int i = 0; i <= mid; i++) { printLine(mid, i, n); } // 打印下半部分 for (int i = mid - 1; i >= 0; i--) { printLine(mid, i, n); } } private static void printLine(int mid, int i, int total) { // 1. 打印前导空格 for (int j = 0; j < Math.abs(mid - i); j++) { System.out.print(" "); } // 2. 打印第一个星号 System.out.print("*"); // 3. 计算中间空格数 int innerSpace = total - 2 * Math.abs(mid - i) - 2; // 4. 打印中间空格和尾星号(非首行) if (innerSpace > 0) { for (int j = 0; j < innerSpace; j++) { System.out.print(" "); } System.out.print("*"); } // 5. 换行 System.out.println(); } }

关键逻辑说明

  1. 输入处理

    • 要求输入奇数高度(偶数自动+1)
    • 示例:输入5生成标准菱形
  2. 行数计算

    int mid = n / 2; // 示例:n=5时 mid=2(0起索引)

  3. 空格规律

    | 行号(i) | 前导空格数 | 中间空格数 | 输出示例 |

    |———|————|————|———-|

    | 0 | 2 | -1 | |

    | 1 | 1 | 1 | |

    | 2 | 0 | 3 | |

    Java如何打印空心菱形? 第2张

  4. 核心公式

    • 前导空格:Math.abs(mid - i)
    • 中间空格:总宽度 - 2*前导空格 - 2
    • 尾星号条件:中间空格数 > 0
    • 运行示例

      输入高度5时输出:

      优化建议

      1. 动态构建:改用StringBuilder减少IO操作 StringBuilder sb = new StringBuilder(); // ... 在方法内追加字符 System.out.print(sb.toString());
      2. 异常处理:添加输入验证 if (n <= 0) { System.out.println("高度必须为正整数"); return; }
      3. 扩展性:封装打印方法,支持不同字符 void printDiamond(int n, char symbol) { ... }

      常见问题解决

      • 菱形不对称:确保总行数为奇数
      • 多行合并:检查换行符println()是否遗漏
      • 首尾行异常:验证innerSpace>0的条件判断

      引用说明:本文代码逻辑基于空间几何对称性原则实现,参考《Java编程思想》中循环控制结构的最佳实践,算法通过数学关系式动态计算空格位置,避免硬编码提升可扩展性。

      Java如何打印空心菱形? 第3张

0