Java循环嵌套打印杨辉三角时,空格对齐是保证输出美观的核心环节,需要结合杨辉三角的行列特性和数值显示规律设计逻辑。杨辉三角的每一行数值数量等于行号,且数值从两端向中间对称,数值位数会随着行数增加逐渐变多,因此空格的数量需要根据当前行号和最大行号的数值位数动态调整。

杨辉三角的基础生成逻辑
杨辉三角的核心规律是:第n行有n个数值,第一个和最后一个数值都是1,中间的第k个数值等于上一行的第k-1个数值和第k个数值之和。使用循环嵌套实现时,外层循环控制行数,内层第一个循环计算每一行的数值,第二个循环负责输出空格完成对齐。
数值计算实现
可以先通过二维数组存储每一行的数值,方便后续输出时统一处理空格。计算数值的代码如下:
public class YanghuiTriangle {
public static void main(String[] args) {
int rows = 10; // 定义打印的行数
int[][] triangle = new int[rows][rows];
// 外层循环遍历每一行
for (int i = 0; i < rows; i++) {
// 每一行的第一个和最后一个元素都是1
triangle[i][0] = 1;
triangle[i][i] = 1;
// 计算中间的元素,从第二行开始
for (int j = 1; j < i; j++) {
triangle[i][j] = triangle[i-1][j-1] + triangle[i-1][j];
}
}
}
}
空格对齐的核心技巧
空格对齐的关键是确定每一行需要输出的前置空格数量,以及数值之间的间隔空格数量。需要先计算最大行号中最大数值的位数,作为单个数值的占位宽度,再根据当前行号计算前置空格数。
计算数值占位宽度
首先需要找到整个杨辉三角中最大的数值,计算它的位数,作为每个数值的固定占位宽度。如果数值位数不足占位宽度,就用空格在数值左侧补齐,保证每个数值占用的水平宽度一致。
// 找到杨辉三角中的最大数值
int maxNum = 0;
for (int i = 0; i < rows; i++) {
for (int j = 0; j <= i; j++) {
if (triangle[i][j] > maxNum) {
maxNum = triangle[i][j];
}
}
}
// 计算最大数值的位数,作为占位宽度
int width = String.valueOf(maxNum).length();
前置空格计算逻辑
每一行的前置空格数量需要和当前行号成反比,行号越小,前置空格越多,保证整体呈现三角形。前置空格的数量可以用(rows - 当前行号 - 1) * (width + 1)计算,其中width+1是每个数值加一个间隔空格的总宽度。
完整输出代码
结合数值计算和空格对齐逻辑,完整的打印代码如下:
public class YanghuiTriangle {
public static void main(String[] args) {
int rows = 10;
int[][] triangle = new int[rows][rows];
// 计算杨辉三角数值
for (int i = 0; i < rows; i++) {
triangle[i][0] = 1;
triangle[i][i] = 1;
for (int j = 1; j < i; j++) {
triangle[i][j] = triangle[i-1][j-1] + triangle[i-1][j];
}
}
// 计算最大数值的占位宽度
int maxNum = 0;
for (int i = 0; i < rows; i++) {
for (int j = 0; j <= i; j++) {
if (triangle[i][j] > maxNum) {
maxNum = triangle[i][j];
}
}
}
int width = String.valueOf(maxNum).length();
// 输出杨辉三角,处理空格对齐
for (int i = 0; i < rows; i++) {
// 输出前置空格
int leadingSpaces = (rows - i - 1) * (width + 1);
for (int s = 0; s < leadingSpaces; s++) {
System.out.print(" ");
}
// 输出当前行的数值,每个数值占width位,左补空格
for (int j = 0; j <= i; j++) {
System.out.printf("%" + width + "d ", triangle[i][j]);
}
System.out.println();
}
}
}
不同场景的适配技巧
如果需要打印的行数较多,最大数值的位数会增加,上述动态计算width的方式可以自动适配,不需要手动调整参数。如果希望数值之间间隔更大,可以在printf的格式字符串中增加宽度,比如%" + (width + 1) + "d,让每个数值的占位宽度增加1个空格。
另外,如果不需要存储整个二维数组,也可以在输出每一行时实时计算数值,同时处理空格对齐,这样可以减少内存占用,适合行数较多的场景。实时计算的空格逻辑和上述方式一致,只需要把数值计算放到输出循环内部即可。