
本文详解如何用嵌套循环生成每行首尾元素不相同的数字三角形,核心在于重置每行起始值并控制增量逻辑,避免全局累加干扰。
要实现如下的目标三角形模式:
1 3 5 5 8 11 7 11 15 19 9 14 19 24 29
关键观察点有三:
- 每行起始数字构成等差数列:第1行起始为 1,第2行为 3,第3行为 5……即第 i 行起始值 = 2*i - 1;
- 每行内相邻元素差值固定为当前行号 i(第1行差0?实际仅1个数;第2行差2 → 5−3=2;第3行差3 → 8→11→14? 不对——再验证目标数据);
重新分析目标输出的行内公差:
- 第1行:[1] → 无差
- 第2行:3, 5 → 差 = 2
- 第3行:5, 8, 11 → 差 = 3
- 第4行:7, 11, 15, 19 → 差 = 4
- 第5行:9, 14, 19, 24, 29 → 差 = 5
✅ 结论明确:第 i 行的公差为 i,且*该行首项为 `2i - 1`**。
因此,正确逻辑应为:
- 外层循环 i 控制行号(1~5);
- 每行初始化 p = 2*i - 1(首项);
- 内层循环 j 控制列数(1~i),每次打印 p 后,令 p += i(按行公差递增)。
✅ 推荐实现代码(清晰、可读、符合数学规律):
for (int i = 1; i <= 5; i++) {
int p = 2 * i - 1; // 当前行首项
for (int j = 1; j <= i; j++) {
System.out.print(p);
if (j < i) System.out.print(" "); // 末尾不加空格
p += i; // 每次增加当前行号 i
}
System.out.println();
}输出完全匹配目标:
1 3 5 5 8 11 7 11 15 19 9 14 19 24 29
⚠️ 注意事项:
- 原问题中错误源于使用了跨行累积的 p += k 和全局 k++,导致状态污染;每行必须独立初始化起始值;
- 若需对齐输出(如右对齐/等宽),可用 System.out.printf("%-4d", p) 替代 print(p + " "),例如:
System.out.printf("%-4d", p); // 左对齐,占4字符宽度 - 该模式本质是「首项为奇数序列、公差为行号」的等差数列逐行展开,适用于任意行数 n,只需将 5 替换为 n。
总结:解决此类模式题,优先分析行首规律与行内增量规律,摒弃全局变量累加思维,采用“行内局部变量 + 确定初值与步长”的设计,即可稳健生成任意结构化数字三角形。











