【Java】打印杨辉三角


根据输入行数,打印出杨辉三角形,如图1.10所示。


【Java案例】打印杨辉三角_杨辉三角


图1.10  杨辉三角形

案例分析



观察杨辉三角形的图案,可以发现其中的规律:三角形的竖边和斜边都是“1”,三角形里面的任意一个数字正好等于它正上方的数字和左上角的数字两个数字之和。第几行就有几个数字,可以把它补充成如图1.11所示效果。


【Java案例】打印杨辉三角_杨辉三角_02

图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所示。


【Java案例】打印杨辉三角_二维数组_03

图1.12  程序输出结果

【Java案例】打印杨辉三角_i++_04

【Java案例】打印杨辉三角_杨辉三角_05

长按指纹,识别二维码,一键关注



扩展训练

图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所示。

【Java案例】打印杨辉三角_i++_06 

图1.13  程序输出结果