如何打印首尾元素不同的递增数字三角形模式

本文详解如何用嵌套循环生成每行首尾元素不相同的数字三角形,核心在于重置每行起始值并控制增量逻辑,避免全局累加干扰。

要实现如下的目标三角形模式:

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。

总结:解决此类模式题,优先分析行首规律行内增量规律,摒弃全局变量累加思维,采用“行内局部变量 + 确定初值与步长”的设计,即可稳健生成任意结构化数字三角形。