1-3 分别采用一维数组、二维数组输出杨辉三角---》数据结构(Java版)(第4版)实验1:算法设计与分析

题目:

中国南宋数学家杨辉在《详解九章算法》(1261年)中给出以下三角形(后世称为杨辉三角),其中每行数值个数为其行序号n(n>=1),各行两端数值为1,其他数值等于它肩膀上的两个数值之和。n=5的杨辉三角如下:
在这里插入图片描述
杨辉三角的重要意义在于,其各行是二项式(a+b)n展开式(n=0,1,2,…)的系数表。n=2或3的展开式如下:

(a+b)2=a2+2ab+b2
(a+b)3=a3+3a2b+3ab2+b3

分别采用一维数组、二维数组输出杨辉三角。

使用一维数组实现:

public class Test {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        System.out.println("请输入指定的杨辉三角行数:");

        // 储存“杨辉三角”行数
        int line = sc.nextInt();

        // 使用一维数组储存“杨辉三角”数据
        int[] array = getArray(line);

        System.out.println("打印的杨辉三角如下:");

        print(array, line);
    }

    /**
     * 向一维数组中填充数据
     *
     * @param line 行数
     * @return
     */
    public static int[] getArray(int line) {

        // 获得一维数组大小,这是等差数列,从1开始,差值是1
        int sum = line * (line + 1) / 2;

        // 确定一维数组大小
        int[] array = new int[sum];

        // 遍历行数
        for (int i = 1; i <= line; i++) {

            // 该行开始位置的下标
            int start = i * (i - 1) / 2;

            // 该行结束位置的下标
            int end = start + i - 1;

            // 将开始位置和结束位置元素置为1
            array[start] = array[end] = 1;

            // 只计算中间元素值
            for (int j = start + 1; j < end; j++) {
                array[j] = array[j - i + 1] + array[j - i];
            }
        }

        return array;
    }

    /**
     * 按照要求输出杨辉三角
     *
     * @param array 一维数组
     * @param line  行数
     */
    public static void print(int[] array, int line) {

        // 空格数目
        int num = line - 1;

        // 遍历行数
        for (int i = 1; i <= line; i++) {

            // 打印空格
            for (int k = 0; k < num; k++) {
                System.out.print(" ");
            }

            // 打印数值
            // 该行初始位置下标
            int start = i * (i - 1) / 2;

            // 该行结束位置下标
            int end = start + i - 1;

            for (int j = start; j <= end; j++) {
                System.out.print(array[j] + " ");
            }

            System.out.println();

            // 减少空格数目
            num--;
        }
    }
}

结果:

请输入指定的杨辉三角行数:
5
打印的杨辉三角如下:
    1 
   1 1 
  1 2 1 
 1 3 3 1 
1 4 6 4 1 

使用二维数组实现:

public class Test {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        System.out.println("请输入指定的杨辉三角行数:");

        // 储存“杨辉三角”行数
        int line = sc.nextInt();

        // 使用二维数组储存“杨辉三角”数据
        int[][] array = getArray(line);

        System.out.println("打印的杨辉三角如下:");

        print(array, line);
    }

    /**
     * 向二维数组中填充数据
     *
     * @param line 行数
     * @return
     */
    public static int[][] getArray(int line) {

        // 确定一维数组大小
        int[][] array = new int[line][];

        // 向二维数组中填充数据
        for (int i = 0; i < line; i++) {

            // 确定相应二维数组大小
            array[i] = new int[i + 1];

            // 二维数组中的第一个元素和最后一个元素都是1
            array[i][0] = array[i][i] = 1;

            // 从第3行数据开始计算,毕竟前面两行都是1,并且通过给j赋初始值和二维数组长度判断,之后去除二维数组开头和结尾计算
            for (int j = 1; j < i; j++) {
                // 肩膀的两个数据之和
                array[i][j] = array[i - 1][j - 1] + array[i - 1][j];
            }
        }

        return array;
    }

    /**
     * 按照要求输出杨辉三角
     *
     * @param array 二维数组
     * @param line  行数
     */
    public static void print(int[][] array, int line) {

        // 空格数目
        int num = line - 1;

        // 遍历行数
        for (int i = 0; i < line; i++) {

            //打印空格
            for (int j = 0; j < num; j++) {
                System.out.print(" ");
            }

            //打印数值
            for (int k = 0; k <= i; k++) {
                System.out.print(array[i][k] + " ");
            }

            System.out.println();

            // 减少空格数目
            num--;
        }
    }
}

结果:

请输入指定的杨辉三角行数:
5
打印的杨辉三角如下:
    1 
   1 1 
  1 2 1 
 1 3 3 1 
1 4 6 4 1 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值