Java语言实现杨辉三角

一.提出问题。
使用二维数组打印出如下图的杨辉三角。
在这里插入图片描述
二.分析问题。
1.首先想要输出杨辉三角,就要找到它有什么规律?
①第n行有n个数字;
②每一行开始和结束的数字都为1;
每一个数字都等于它的左上角的数字与右上角数字之和
2.其次题目要使用二维数组打印杨辉三角,我们该如何用二维数组表示?
我们可以创建一个二维数组,来表示杨辉三角的行和列。空白的位置我们可以用数字0表示。通过题目所给出的图,我们可以看出,这是一个10行,21列的杨辉三角。

//创建二维数组
 int[][] arr=new int[10][21];

在这里插入图片描述
得到这个初始二维数组,我们可以根据杨辉三角的规律进行遍历赋值。
3.如何给二维数组赋值?
有题目给出的图片可得,第一行只有一个数字且永远为1,所以我们可以先给第一行进行赋值,然后根据规律向下展开赋值。
赋值时要注意杨辉三角行和列的表示与二维数组索引的关系。索引是从0开始的,所以第n行应该是n-1;

//对第一行最中间的数赋值
arr[0][10]=1;
//根据杨辉三角的规律,使用二维数组遍历,赋值
for(int i=1;i< arr.length;i++){//第一行已经赋值,所以从第2行开始到第10行
  for(int j=1;j<arr[i].length-1;j++){//由于每一行的最左列和最右列分别没有左上值和右上值,所以每一行的遍历应从第2列开始到第20列
             
      arr[i][j]=arr[i-1][j-1]+arr[i-1][j+1];//杨辉三角中的值等于它的左上角的值+右上角的值。

            }
        }

在这里插入图片描述

4.经过第三步给二维数组赋值之后,我们应如何输出这个杨辉三角呢?
将第三步得出的二维数组与题目所给的杨辉三角进行比较后发现,输出时,为0的话不能输出,要用空格代替,输出不为零的数。

 //遍历输出杨辉三角
  for(int i=0;i< arr.length;i++){ //从第一个一维数组开始
       for(int j=0;j<arr[i].length;j++){//输出第i个一维数组中的值
               if(arr[i][j]!=0){ //如果值不等于零时,将它输出
                    System.out.print(arr[i][j]+" ");
             }else{ //如果值等于零,用空格代替
                    System.out.print(" ");
                }
            }
            System.out.println();
        }

在这里插入图片描述
得出此杨辉三角我们发现,这并不是一个等边三角形,所以此时我们需要使用“t”来代替“ ”;
"t"相当于表格制表符tab键,一个格内放8的整数倍的字符,根据显示的字符串长度,剩下的显示空格数。
三.解决问题。
经过一系列的分析,我们可以得到解决这个问题的完整代码:

public class Yhsanjiao {
    public static void main(String[] args) {
    //第一步:创建二维数组
        int[][] arr=new int[10][21];
   //第二步:根据杨辉三角的规律,对二维数组遍历赋值
        //给第一行最中间赋值1
        arr[0][10]=1;
        for(int i=1;i< arr.length;i++){
            //每一行从第二个数开始到倒数第二个结束,因为最左边没有左上的值,最右边没有右上的值都为0
            for(int j=1;j<arr[i].length-1;j++){
                //杨辉三角中的值等于它的左上角的值+右上角的值。
                arr[i][j]=arr[i-1][j-1]+arr[i-1][j+1];

            }
        }
   //第三步:遍历输出杨辉三角
        //从第一个一维数组开始
        for(int i=0;i< arr.length;i++){
            //输出第i个一维数组中的值
            for(int j=0;j<arr[i].length;j++){
                //如果值不等于零时,将它输出
                if(arr[i][j]!=0){
                    System.out.print(arr[i][j]+"t");
                //如果值等于零,用空格代替
                }else{
                    System.out.print(" t");
                }
            }
            System.out.println();
        }
    }
}

在这里插入图片描述
四.代码优化。
以上题目需要输出一个10层的等边杨辉三角,我们可以对层数进行一个输入,这样需要几层输入几层就可以。

import java.util.Scanner;

public class Yhsanjiao {
    public static void main(String[] args) {
        Scanner s=new Scanner(System.in);
        System.out.println("请输入杨辉三角的层数:");//为了输出美观,层数不要超过13.若层数需要超过13,可以通过添加输出杨辉三角中的"t"来运行。
        int row=s.nextInt();//输入一个杨辉三角的层数。
        //确定二维数组的长度
        /*
        这个二维数组中有row个一维数组;
        因为通过杨辉三角的规律,第零行有一个值,第一行有三个值(包含0),第二行有五个值以此类推,第row行有2*row+1个值;
        所以每个一维数组的长度为2*row+1;
         */
        int[][] arr=new int[row][2*row+1];

        //给第一行最中间赋值1
        arr[0][row]=1;
        //将杨辉三角中的数表示出来    第一行arr[0][row]直接赋值,所以从第二行开始
        for(int i=1;i< arr.length;i++){
            //每一行从第二个数开始到倒数第二个结束,因为最左边没有左上的值,最右边没有右上的值都为0
            for(int j=1;j<arr[i].length-1;j++){
                //杨辉三角中的值等于它的左上角的值+右上角的值。
                arr[i][j]=arr[i-1][j-1]+arr[i-1][j+1];

            }
        }
        //遍历输出杨辉三角
        //从第一个一维数组开始
        for(int i=0;i< arr.length;i++){
            //输出第i个一维数组中的值
            for(int j=0;j<arr[i].length;j++){
                //如果值不等于零时,将它输出
                if(arr[i][j]!=0){
                    System.out.print(arr[i][j]+"t");
                //如果值等于零,用空格代替
                }else{
                    System.out.print(" t");
                }
            }
            System.out.println();
        }



    }
}

在这里插入图片描述