62,621
社区成员
发帖
与我相关
我的任务
分享
public class YangHuiTriangle {
private int n;
/*****用一个一维数组存放下三角的二维数组. 二维数组中第i行,第j列的元素放在mat[i*(i+1)/2+j+1]中
*/
private long[] mat;
public YangHuiTriangle(int n) {
this.n = n;
mat=new long[(1+n)*n/2+1];
mat[0]=1;
for(int i=1;i<n;i++){
for(int j=0;j<=i;j++){
/* 超出了边界mat[(1+i)*i/2+j+1]=1
*/
if(i*(i-1)/2+j<i*(i-1)/2+1||i*(i-1)/2+j>=i*(i-1)/2+i){
mat[(1+i)*i/2+j+1]=1;
}else{
/* 当前元素的值等于左上+正上元素之和.
*/
mat[(1+i)*i/2+j+1]=mat[i*(i-1)/2+j]+mat[i*(i-1)/2+j+1];
}
}
}
}
//这个打印程序可以是以金字塔形式打印杨辉三角形.数据位数可以7位,但实际屏幕放不下。可以打16行。
//如果是在DOS窗口下打印,可以在窗口标题栏上,右键单击,选属性,把屏幕的宽度增大到200。这样可以看到20以上的杨辉三角形了。
//思路是每一个数据的输出都占固定的长度,数据本身小于8,前面用空格补足,本方法中数据输出定为8
public void printYangHuiTriangle() {
System.out.println("杨辉三角(" + n + ")层:");
String space=" ";
System.out.println(space.substring(0,(n-1)*4+7)+1);
long temp;
for (int i = 1; i <= n - 1; i++) {
System.out.print(space.substring(0,(n-i-1)*4));
for (int j = 0; j <= i; j++) {
temp=mat[(1+i)*i/2+j+1];
System.out.print(space.substring(0,8-(Long.toString(temp)).length())+temp);
}
System.out.println();
}
}
public static void main(String[] args) {
YangHuiTriangle y = new YangHuiTriangle(20);
y.printYangHuiTriangle();
}
}
F:\java>java YangHuiTriangle
杨辉三角(20)层:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
1 10 45 120 210 252 210 120 45 10 1
1 11 55 165 330 462 462 330 165 55 11 1
1 12 66 220 495 792 924 792 495 220 66 12 1
1 13 78 286 715 1287 1716 1716 1287 715 286 78 13 1
1 14 91 364 1001 2002 3003 3432 3003 2002 1001 364 91 14 1
1 15 105 455 1365 3003 5005 6435 6435 5005 3003 1365 455 105 15 1
1 16 120 560 1820 4368 8008 11440 12870 11440 8008 4368 1820 560 120 16 1
1 17 136 680 2380 6188 12376 19448 24310 24310 19448 12376 6188 2380 680 136 17 1
1 18 153 816 3060 8568 18564 31824 43758 48620 43758 31824 18564 8568 3060 816 153 18 1
1 19 171 969 3876 11628 27132 50388 75582 92378 92378 75582 50388 27132 11628 3876 969 171 19 1
F:\java>