/** * 杨辉三角算法之一 * 使用一维数组进行计算 * @author Administrator * */ import java.util.*; public class Triangle { /* a:第K行第一个数的下标值 * m:第K+1行第一个数的下标值 * b:第K行最后一个数的下标值 * n:第K+1行最后一个数的下标值 * * 规律为除两侧的元素均为1以外,其余每个位置上数值都等于其左上角元素与右上角元素之和 * 第K行有K个数 * array[m+1]=array[a]+array[a+1]; * array[m+2]=array[a+1]+array[a+2]; * 即: * array[m+t+1]=array[a+t]+array[a+t+1]; * t从零开始,t应该小于等于K-2(保证a+k-2+1=b); * * * 由题已知: * array[a]=1; * array[b]=1; * array[m]=1; * array[n]=1; * b-a=k-1; * m=b+1; * n-m=k; */ //int k;//行号 //List list = new ArrayList((k+1)*k/2);//初始化大小 public final static String SEPARATOR=" "; public final static String SEPARATOR_NUM=" "; public final static int LEN=6; public final static int SEPARATOR_LEN=3; public StringBuffer init(int k){ int a,b,m,n;//下标 int arr[] = new int[(k+1)*k/2];//初始化大小 StringBuffer sb = new StringBuffer(); //打印第一行 if(k>0){ sb.append(numSeparator(k).toString()); sb.append(toStr(1,LEN));//此行第一个数 } for(int L=1;L<k;L++){//行号循环 a = ((L-1)+1)*(L-1)/2;//第l行的第一个数的下标值 b = a+L-1; m = b+1; n = m+L; arr[a]=1; arr[b]=1; arr[m]=1; arr[n]=1; sb.append("\n");//新启一行 //距离最左边占位符 sb.append(numSeparator(k-L).toString()); sb.append(toStr(arr[m],LEN)+separatorStr());//此行第一个数 for(int t=0;t<=L-2;t++){//计算中间的值 arr[m+t+1]=arr[a+t]+arr[a+t+1]; sb.append(toStr(arr[m+t+1],LEN)+separatorStr()); } sb.append(toStr(arr[n],LEN));//此行最后一个数 } return sb; } /** * 设定数字的长度为len * 不足长度的以空格补齐 * @param x * @param len * @return */ public String toStr(int x,int len){ StringBuffer sb = new StringBuffer(""); String str = String.valueOf(x); if(str.length()<len){ int i = len-str.length(); for(int k=0;k<i/2;k++){ sb.append(Triangle.SEPARATOR_NUM); } sb.append(str); for(int k=i/2;k<i;k++){ sb.append(Triangle.SEPARATOR_NUM); } }else{ sb.append(str); } return sb.toString(); } /** * //两个数字之间占位符长度的一半 * @return */ public String separatorStr(){ StringBuffer sb = new StringBuffer(""); for(int p=0;p<SEPARATOR_LEN;p++){//两个数字之间占位符长度的一半 sb.append(SEPARATOR); } return sb.toString(); } /** * (总行数-行数序号(从一开始))*两个数字之间占位长度/2 * k行距离左边的占位符数 * @param k * @return */ public String numSeparator(int k){ StringBuffer sb = new StringBuffer(""); for(int j=0;j<k-1;j++){ for(int p=0;p<SEPARATOR_LEN/2;p++){//两个数字之间占位符长度的一半 sb.append(SEPARATOR); } for(int p=0;p<=LEN/2;p++){//预设数字本身长度的一半 sb.append(SEPARATOR_NUM); } } return sb.toString(); } public static void main(String[] arr){ int k=20; if(arr.length>=1){ try{ k=Integer.parseInt(arr[0]); }catch(NumberFormatException e){ System.out.print(e.getMessage()); } } Triangle t = new Triangle(); System.out.print(t.init(k).toString()); } }