在经典算法50上看到的算法。如下两图就是巴斯卡三角形,直接看图就可以理解。算法精妙浓缩到p = p * (n-i+1) / i;上。 但是这个打印出来的金字塔不好排列,我写了两个方法把他改好看一点,使用最大数的长度+2来做为标准的间隔。
高度 n=6
高度 n=12
代码如下:
public static void main(String[] args) {
int N=6; //三角形的行高。
int n, r;
Long max=combi(N, N/2);
int maxlen=max.toString().length();
for(n = 0; n <= N; n++) {
for(r = 0; r <= n; r++) {
int i;/* 排版设定开始 */
if(r == 0) {
for(i = 0; i <= (N-n); i++)
printNull(maxlen);
}else {
printNull(maxlen);
} /* 排版设定结束 */
//打印数字
printNum(n,r,maxlen);
}
System.out.println("");
}
}
public static long combi(int n, int r){
int i;
long p = 1;
for(i = 1; i <= r; i++)
p = p * (n-i+1) / i;
return p;
}
//打印空格
public static void printNull(int maxlen){
StringBuilder numstr=new StringBuilder();
int strlen=maxlen+2; //最大数两边留个空位
for (int i = 1; i <=strlen; i++) {
numstr.append(" ");
}
System.out.print(numstr);
}
//打印空格加数字
public static void printNum(int n,int r,int maxlen){
Long num=combi(n, r);
int len=num.toString().length();
StringBuilder numstr=new StringBuilder();
int strlen=maxlen+2; //最大数两边留个空位
boolean addNum=false;
for (int i = 1; i <=strlen; i++) {
if(i<=(strlen-len)/2){
// if(i==1){
// numstr.append("[");
// }else {
numstr.append(" ");
// }
}else if((strlen-len)/2<i&&i<=((strlen-len)/2+len)&&!addNum){
numstr.append(num.toString());
addNum=true;
}else if((strlen-len)/2<i&&i<=((strlen-len)/2+len)&&addNum){
}else{
// if(i==strlen){
// numstr.append("]");
// }else {
numstr.append(" ");
// }
}
}
System.out.print(numstr);
}