Java打印菱形需拆分为上、下半部分:上半部分第i行空格数为n-1-i、星号数为2i+1;下半部分第j行空格数为j+1、星号数为2(n-2-j)+1,用双重循环实现。

Java 中用双重循环打印菱形,关键是把菱形拆成上半部分(含中间行)和下半部分,每行的空格数和星号数都和当前行号有明确数学关系。核心在于找准每行 空格个数 和 星号个数 的表达式,而不是硬记边界。
上半部分:行号从 0 到 n-1(共 n 行)
假设菱形总行数为奇数 2n−1(例如 5 行对应 n=3),则上半部分共 n 行(第 0 行到第 n−1 行):
- 第 i 行(i 从 0 开始):前面有 n - 1 - i 个空格
- 该行星号数为 2 * i + 1(从 1 开始,逐行+2)
- 例如 n=3(总行数 5),i=0 → 空格 2 个,星号 1 个;i=1 → 空格 1 个,星号 3 个;i=2 → 空格 0 个,星号 5 个
下半部分:行号从 0 到 n-2(共 n−1 行)
下半部分对称,可复用上半部分逻辑,只需把行索引“倒过来”:
- 第 j 行(j 从 0 开始,共 n−1 行):前面有 j + 1 个空格
- 该行星号数为 2 * (n - 2 - j) + 1,或更直观地:从上半部分倒数第二行开始递减 → 星号数 = 2 * n - 3 - 2 * j
- 例如 n=3,j=0 → 空格 1 个,星号 3 个;j=1 → 空格 2 个,星号 1 个
双重循环结构写法(以 n=3 为例)
外层循环控制行,内层两个并列循环分别打空格和星号:
立即学习“Java免费学习笔记(深入)”;
<font size="2">int n = 3; // 上半部分行数<br>// 上半部分<br>for (int i = 0; i < n; i++) {<br> for (int s = 0; s < n - 1 - i; s++) System.out.print(" ");<br> for (int k = 0; k < 2 * i + 1; k++) System.out.print("*");<br> System.out.println();<br>}<br>// 下半部分<br>for (int j = 0; j < n - 1; j++) {<br> for (int s = 0; s < j + 1; s++) System.out.print(" ");<br> for (int k = 0; k < 2 * (n - 2 - j) + 1; k++) System.out.print("*");<br> System.out.println();<br>}</font>关键提醒:别混淆“总行数”和“n”的关系
很多初学者直接用总行数(如 5)当 n,结果上下不对称。正确做法是:
- 先确定总行数为奇数 total = 2*n - 1,解出 n = (total + 1) / 2
- 比如要打印 7 行菱形,n = (7+1)/2 = 4,上半部分循环 i=0→3,下半部分 j=0→2
- 所有空格/星号公式都基于这个 n,不是 total



















