题目:
中国南宋数学家杨辉在《详解九章算法》(1261年)中给出以下三角形(后世称为杨辉三角),其中每行数值个数为其行序号n(n>=1),各行两端数值为1,其他数值等于它肩膀上的两个数值之和。n=5的杨辉三角如下:
杨辉三角的重要意义在于,其各行是二项式(a+b)n展开式(n=0,1,2,…)的系数表。n=2或3的展开式如下:
(a+b)2=a2+2ab+b2
(a+b)3=a3+3a2b+3ab2+b3
分别采用一维数组、二维数组输出杨辉三角。
使用一维数组实现:
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入指定的杨辉三角行数:");
// 储存“杨辉三角”行数
int line = sc.nextInt();
// 使用一维数组储存“杨辉三角”数据
int[] array = getArray(line);
System.out.println("打印的杨辉三角如下:");
print(array, line);
}
/**
* 向一维数组中填充数据
*
* @param line 行数
* @return
*/
public static int[] getArray(int line) {
// 获得一维数组大小,这是等差数列,从1开始,差值是1
int sum = line * (line + 1) / 2;
// 确定一维数组大小
int[] array = new int[sum];
// 遍历行数
for (int i = 1; i <= line; i++) {
// 该行开始位置的下标
int start = i * (i - 1) / 2;
// 该行结束位置的下标
int end = start + i - 1;
// 将开始位置和结束位置元素置为1
array[start] = array[end] = 1;
// 只计算中间元素值
for (int j = start + 1; j < end; j++) {
array[j] = array[j - i + 1] + array[j - i];
}
}
return array;
}
/**
* 按照要求输出杨辉三角
*
* @param array 一维数组
* @param line 行数
*/
public static void print(int[] array, int line) {
// 空格数目
int num = line - 1;
// 遍历行数
for (int i = 1; i <= line; i++) {
// 打印空格
for (int k = 0; k < num; k++) {
System.out.print(" ");
}
// 打印数值
// 该行初始位置下标
int start = i * (i - 1) / 2;
// 该行结束位置下标
int end = start + i - 1;
for (int j = start; j <= end; j++) {
System.out.print(array[j] + " ");
}
System.out.println();
// 减少空格数目
num--;
}
}
}
结果:
请输入指定的杨辉三角行数:
5
打印的杨辉三角如下:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
使用二维数组实现:
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入指定的杨辉三角行数:");
// 储存“杨辉三角”行数
int line = sc.nextInt();
// 使用二维数组储存“杨辉三角”数据
int[][] array = getArray(line);
System.out.println("打印的杨辉三角如下:");
print(array, line);
}
/**
* 向二维数组中填充数据
*
* @param line 行数
* @return
*/
public static int[][] getArray(int line) {
// 确定一维数组大小
int[][] array = new int[line][];
// 向二维数组中填充数据
for (int i = 0; i < line; i++) {
// 确定相应二维数组大小
array[i] = new int[i + 1];
// 二维数组中的第一个元素和最后一个元素都是1
array[i][0] = array[i][i] = 1;
// 从第3行数据开始计算,毕竟前面两行都是1,并且通过给j赋初始值和二维数组长度判断,之后去除二维数组开头和结尾计算
for (int j = 1; j < i; j++) {
// 肩膀的两个数据之和
array[i][j] = array[i - 1][j - 1] + array[i - 1][j];
}
}
return array;
}
/**
* 按照要求输出杨辉三角
*
* @param array 二维数组
* @param line 行数
*/
public static void print(int[][] array, int line) {
// 空格数目
int num = line - 1;
// 遍历行数
for (int i = 0; i < line; i++) {
//打印空格
for (int j = 0; j < num; j++) {
System.out.print(" ");
}
//打印数值
for (int k = 0; k <= i; k++) {
System.out.print(array[i][k] + " ");
}
System.out.println();
// 减少空格数目
num--;
}
}
}
结果:
请输入指定的杨辉三角行数:
5
打印的杨辉三角如下:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1