【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 程序输出结果

本文分享自微信公众号 - Java帮帮(javahelp)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-02-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java基础-day05-基础题

    Java基础-day05-基础题 1.定义:3个重载方法,求2个,3个,4个数的平均数。 ? 代码实现: package StudentJavaSEday05;...

    Java帮帮
  • 轻松学,Java 中的代理模式及动态代理【面试+工作】

    代理是英文 Proxy 翻译过来的。我们在生活中见到过的代理,大概最常见的就是朋友圈中卖面膜的同学了。

    Java帮帮
  • 数据结构是哈希表(hashTable)(二)

    public class HashTableDouble { private DataItem[] hashArray; privat...

    Java帮帮
  • Linux静态链接库与模板类的处理方式

    在阅读本文之前,小编先给大家介绍一篇相关文章:Linux静态链接库使用类模板的快速排序算法

    砸漏
  • C++的引用与const指针的关系以及各种传递方式

    首先我们知道 const int *p 与 int const *p 是一样的,即 *p 是常量;而 int * const p 跟上面是不一样的,即 p 是常...

    s1mba
  • LWC 51:682. Baseball Game

    LWC 51:682. Baseball Game 传送门:682. Baseball Game Problem: You’re now a baseball...

    用户1147447
  • HDU 3368 Reversi

    http://acm.hdu.edu.cn/showproblem.php?pid=3368 题意:模拟黑白棋,下一步黑手最大可以转化多少个白旗 分析:暴力  ...

    用户1624346
  • 【leetcode】Palindrome Partitioning II

    Given a string s, partition s such that every substring of the partition is a pa...

    阳光岛主
  • 剑指offer 连续子数组的最大和

    HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候...

    week
  • 小白详细讲解快速幂--杭电oj2035-A^B

    输入数据包含多个测试实例,每个实例占一行,由两个正整数A和B组成(1<=A,B<=10000),如果A=0, B=0,则表示输入数据的结束,不做处理。

    用户2038589

扫码关注云+社区

领取腾讯云代金券