1. 程式人生 > 其它 >【Java案例】列印楊輝三角

【Java案例】列印楊輝三角

根據輸入行數,打印出楊輝三角形,如圖1.10所示。

圖1.10 楊輝三角形

案例分析

觀察楊輝三角形的圖案,可以發現其中的規律:三角形的豎邊和斜邊都是“1”,三角形裡面的任意一個數字正好等於它正上方的數字和左上角的數字兩個數字之和。第幾行就有幾個數字,可以把它補充成如圖1.11所示效果。

圖1.11 方陣

方陣(行列相等的矩陣)大家都很熟悉了,可以通過二維陣列來處理方陣,一個雙重迴圈就能實現,外迴圈控制行數,內迴圈控制列來完成方陣內數字的計算和儲存。

案例實現

1

確定程式框架

由前面的問題分析可知,先從鍵盤接收楊輝三角的高度,然後通過二維陣列計算儲存楊輝三角,最後把楊輝三角打印出來。程式框架程式碼如下:

public class Ch1_5 
{
public static void main(String[] args) 
{
  System.out.print("請輸入行數:");
  Scanner scanner = new Scanner(System.in);
  int num = scanner.nextInt(); //鍵盤接收行數
  int[][] ary = getTriangle(num); //得到楊輝三角
  print(ary); //列印楊輝三角
}
}

2

得到楊輝三角

由前面的問題分析可知,用二維陣列計算儲存楊輝三角,楊輝三角豎邊、斜邊都為1,可以先賦值,然後再給中間元素賦值,當前位置的值等於它的上方數和左上角上的數之和。程式程式碼如下:

private static int[][] getTriangle(int num) 
{
int[][] ary = new int[num][num]; //用二維陣列儲存
for(int i = 0; i < ary.length; i++) //豎邊、斜邊置1
{
ary[i][0] = 1;
ary[i][i] = 1;
}
for(int i = 1; i < ary.length; i++) //外迴圈控制行數
{
for(int j = 1; j <= i; j++) //內迴圈控制列
{
//裡面部分,等於當前位置的上方和左上角之和
ary[i][j] = ary[i-1][j-1] + ary[i-1][j];
}
}
return ary;
}

3

列印楊輝三角

楊輝三角儲存在二維陣列中,通過一個雙重迴圈就可以打印出來,但是要注意的是,不需要把所有元素都打印出來,內迴圈列的控制要小於等於當前行數。程式程式碼如下:

private static void print(int[][] ary)
{
for(int i=0;i<ary.length;i++) //外迴圈控制行
{
for(int j=0;j<=i;j++) //內迴圈控制列
{
System.out.printf(" %-3d", ary[i][j]);
}
System.out.println(); //換行
}
}

4

完整程式

現在我們就需要把剛才的程式進行組合,構成我們的完整程式:

import java.util.Scanner;
public class Ch1_5 
{
public static void main(String[] args) 
{
  System.out.print("請輸入行數:");
  Scanner scanner = new Scanner(System.in);
  int num = scanner.nextInt(); //從鍵盤接收行數
  int[][] ary = getTriangle(num); //得到楊輝三角
  print(ary); //列印楊輝三角
}
//得到楊輝三角
private static int[][] getTriangle(int num) 
{
int[][] ary = new int[num][num]; //用二維陣列儲存
for(int i = 0; i < ary.length; i++) //豎邊、斜邊置1
{
ary[i][0] = 1;
ary[i][i] = 1;
}
for(int i = 1; i < ary.length; i++) //外迴圈控制行
{
for(int j = 1; j <= i; j++) //內迴圈控制列
{
//裡面部分,等於當前位置的上方和左上角之和
ary[i][j] = ary[i-1][j-1] + ary[i-1][j];
}
}
return ary;
}
private static void print(int[][] ary)
{
for(int i=0;i<ary.length;i++) //外迴圈控制行
{
for(int j=0;j<=i;j++) //內迴圈控制列
{
System.out.printf(" %-3d", ary[i][j]);
}
System.out.println(); //輸出換行
}
}
}
5

執行程式

執行程式,結果如圖1.12所示。

圖1.12 程式輸出結果

擴充套件訓練

圖1.12輸出的楊輝三角是直角三角形,能不能輸出等腰三角形呢?答案是肯定的。等腰三角形類似於前面的金字塔圖案,參考前面介紹的思路,不難輸出等腰三角形。

(1)參考程式碼

import java.util.*;
public class Ch1_5_2 
{ 
   public static void main(String[] args) 
   {
   Scanner in = new Scanner(System.in); //獲取控制檯輸入物件
   System.out.print("請輸入行號: ");
   int m = in.nextInt(); //從鍵盤接收輸入
   int n=2*m-1; //列元素個數
   int arr[][]=new int[m][n];
   for(int i=0;i<m;i++) //外迴圈控制行
   {
   for(int j=0;j<n;j++) //內迴圈控制列
   {
   if(j<(m-i-1)||(j>=(m+i))) //輸出等腰三角形兩邊空格
   System.out.print("   ");
   else if((j==(m-i-1))||(j==(m+i-1)))
 //計算並輸出等腰三角形兩個腰
   {
   arr[i][j]=1;
   System.out.printf("%-3d",arr[i][j]);
   }
   else if((i+j)%2==0&&m%2==0||(i+j)%2==1&&m%2==1)
 //中間預設數字0用空格替換
   System.out.print("   ");
   else //計算並輸出中間數字
   {
   arr[i][j]=arr[i-1][j-1]+arr[i-1][j+1];
   System.out.printf("%-3d",arr[i][j]);
   }
   }
           System.out.println(); //輸出換行
   }
   }
}

(2)執行結果

執行程式,結果如圖1.13所示。

圖1.13 程式輸出結果