杨辉三角算法

算法一:

 

下文转自:http://dingjun1.javaeye.com/blog/180888

 

/**
 * 杨辉三角算法之一
 * 使用一维数组进行计算
 * @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());  
 }

}

 

算法二:

 

下文转自:http://blog.sina.com.cn/s/blog_3f33dac1010005h6.html

 

class yanghui
{//杨辉三角 注:N是一个实际参数,可以任意整数
 public static void main(String arg[])
 {
  yanghui(15);
 }
 
 public static void yanghui(int n)
 {
  int i,j;
  int a[][]=new int[n][n];
  for(i=1;i<n;i++)
  {
   a[i][i]=1;
   a[i][1]=1;   
  }
  for(i=3;i<n;i++)
     for(j=2;j<i-1;j++)
     a[i][j]=a[i-1][j-1]+a[i-1][j];
    
    
  for(i=1;i<n;i++)
    { for(j=1;j<i-1;j++)
         if(a[i][j]<=9)//以下6行为了工整输出
                       //这里并不完美。
           System.out.print(a[i][j]+"     ");
         else if(a[i][j]<=99)
           System.out.print(a[i][j]+"    ");
         else
           System.out.print(a[i][j]+"   ");
       System.out.println();
    }
 }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值