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();
}
}
}