实验环境:JDK8
实验工具:IDEA2021
实现思路:
准备用一个二维数组装载杨辉三角,默认给里面所有值先添0,由数学规律易得n行的杨辉三角有2 * n - 1列,先确定好每一行边界 1 的位置并且赋值,然后在两个1区间之间进行规律赋值,由此得出了一个大致的杨辉三角二维数组但却远远不够,我们必须得打印一个对称的杨辉三角。
那我们该怎么办呢?给所有的位置都给予相同的位置数不就好了吗,首先判断出当前杨辉三角的最大值的位数,比如最大值是126,此时位数为3位,打印的时候若遇见了0,就添加3个空格,若遇见两位数则输出该两位数再添加一个空格。
主函数:
public static void main(String[] args) {
int n = 23;
int[][] arr = getInit(n);
int count = getNumDigitsByAll(arr, n);
printTriangle(arr, n, count);
}
结果如下:
初始化getInit函数:
public static int[][] getInit(int n) {
int m = 2 * n - 1;
int arr[][] = new int[n][m];
arr[0][m / 2] = 1;
for (int k = 1; k < n; k++) {
arr[k][m / 2 - k] = 1;
arr[k][m / 2 + k] = 1;
for (int j = 0; j < m; j++) {
if (j - 1 > m / 2 - k && j + 1 < m / 2 + k) {
arr[k][j] = arr[k - 1][j - 1] + arr[k - 1][j + 1];
}
}
}
return arr;
}
打印杨辉三角printTriangle函数:
public static void printTriangle(int[][] arr, int n, int count) {
int m = 2 * n - 1;
int nowDigits;
StringBuilder s = new StringBuilder();
for (int i = 0; i < n; i++) {
for (int k = 0; k < m; k++) {
if (arr[i][k] == 0) {
for (int j = 0; j < count; j++) {
s.append(" ");
}
System.out.print(s);
s = new StringBuilder();
continue;
}
System.out.print(arr[i][k]);
nowDigits = getNumDigits(arr[i][k]);
for (int j = nowDigits + 1; j <= count; j++) {
s.append(" ");
}
System.out.print(s);
s = new StringBuilder();
}
System.out.println();
}
}
一些工具方法:
public static int getNumDigits(int num) {
int count = 0;
while (num != 0) {
num /= 10;
count++;
}
return count;
}
public static int getNumDigitsByAll(int arr[][], int n) {
int m = 2 * n - 1;
if (n % 2 == 0) {
return getNumDigits(arr[n - 1][m / 2 + 1]);
}
return getNumDigits(arr[n - 1][m / 2]);
}
|