【编程马拉松】【010-杨辉三角】

【编程马拉松算法目录>>>】


【010-杨辉三角】【工程下载>>>】


1 题目描述


  1
  1 1
  1 2 1
  1 3 3 1
  1 4 6 4 1
  1 5 10 10 5 1
  上面的图形熟悉吗?它就是我们中学时候学过的杨辉三角。

1.1 输入描述:


  输入数据包含多组测试数据。
  每组测试数据的输入只有一个正整数n(1≤n≤128),表示将要输出的杨辉三角的层数。
  输入以0结束

1.2 输出描述:


  对应于每一个输入,请输出相应层数的杨辉三角,每一层的整数之间用一个空格隔开,每一个杨辉三角后面加一个空行。

1.3 输入例子:


2
3
0

1.4 输出例子:


1
1 1

1
1 1
1 2 1

2 解题思路


2.1解法一


  假设杨辉三角的使用一个二维数组a进行表示。a[i][j]表示第i+1行第j+1列元素的值,有公式:

a[i][j]={1a[i1][j1]+a[i1][j]j=0 or j=i0<j<i

2.2解法二


  将杨辉三角使用一个一维数组a表示,从下标0开始,杨辉三角第i行第j列个元素对应用到数组a的下标为x(i,j):则

x(i,j)=(k=1i1k)+j1 (j1 and ij)
x(i,j)=i(i1)2+j1

  得

a[x(i,j)]={1a[x(i1,j1)][x(i1,j)]j=1 or j=i1<j<i

3 算法实现

import java.math.BigInteger;
import java.util.Scanner;

/**
 * Author: 王俊超
 * Time: 2016-05-09 10:53
 * CSDN: http://blog.csdn.net/derrantcm
 * Github: https://github.com/Wang-Jun-Chao
 * Declaration: All Rights Reserved !!!
 */
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
//        Scanner scanner = new Scanner(Main.class.getClassLoader().getResourceAsStream("data.txt"));
        while (scanner.hasNext()) {
            int num = scanner.nextInt();

            if (num == 0) {
                break;
            }
            System.out.println(triangle2(num));
        }

        scanner.close();
    }

    /**
     * 【解法一】
     * 计算杨辉三角
     *
     * @param n 杨辉三角的行数
     * @return 杨辉三角
     */
    private static String triangle(int n) {

        if (n < 1) {
            throw new IllegalArgumentException("参数必须是正整数");
        }


        if (n == 1) {
            return "1\n";
        } else if (n == 2) {
            return "1\n1 1\n";
        }

        StringBuilder b = new StringBuilder();

        BigInteger[][] t = new BigInteger[n][n];
        for (int i = 0; i < t.length; i++) {
            t[i] = new BigInteger[n];
        }

        for (int i = 0; i < n; i++) {
            for (int j = 0; j <= i; j++) {
                if (j == 0 || i == j) {
                    t[i][j] = new BigInteger("1");
                } else {
                    t[i][j] = t[i - 1][j - 1].add(t[i - 1][j]);
                }
                b.append(t[i][j]).append(' ');
            }

            b.setCharAt(b.length() - 1, '\n');
        }


        return b.toString();
    }

    /**
     * 【解法二】
     * 计算杨辉三角
     *
     * @param n 杨辉三角的行数
     * @return 杨辉三角
     */
    private static String triangle2(int n) {
        if (n < 1) {
            throw new IllegalArgumentException("参数必须是正整数");
        }

        BigInteger[] t = new BigInteger[n * (n + 1) / 2];
        StringBuilder b = new StringBuilder();

        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= i; j++) {

                // 第i行第一个元素的下标是: (i - 1) * i / 2
                // 第i行第j个元素的下标是:(i - 1) * i / 2 + j - 1
                int idx = (i - 1) * i / 2 + j - 1;

                if (j == 1 || i == j) {
                    t[idx] = BigInteger.ONE;
                } else {

                    // 第i-1行第一个元素的下标是: (i - 2) * (i - 1) / 2
                    int x = (i - 2) * (i - 1) / 2 + j - 1;
                    int y = (i - 2) * (i - 1) / 2 + j - 2;
                    t[idx] = t[x].add(t[y]);
                }

                b.append(t[idx].toString()).append(' ');
            }

            b.setCharAt(b.length() - 1, '\n');
        }

        return b.toString();
    }
}

4 测试结果


这里写图片描述

5 其它信息


因为markddow不好编辑,因此将文档的图片上传以供阅读。Pdf和Word文档可以在Github上进行【下载>>>】

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
顺序循环队列可以用数组来实现,我们可以定义一个数组来表示队列,再定义队首和队尾指针来指示队列的头和尾。在队列为空的时候,队首和队尾指针相等,当队列满时,队尾指针会指向数组的最后一个元素,而队首指针会指向数组的第一个元素。队列的基本操作包括入队和出队。 杨辉三角是一个数学上的图形,由于它的特殊性质,它也可以用队列来实现。具体实现方法如下: 1. 定义一个二维数组来存储杨辉三角的数值,同时定义一个队列来存储每一行的数值。 2. 首先将第一行的数值入队,然后从队列中取出队首元素,根据它可以计算出下一行的数值。 3. 将下一行的数值入队,重复上述操作,直到计算到第n行为止。 下面是代码实现: ```c #include <stdio.h> #define MAXSIZE 100 typedef struct { int data[MAXSIZE]; // 存储队列元素 int front; // 队首指针 int rear; // 队尾指针 } SqQueue; // 初始化队列 void InitQueue(SqQueue *q) { q->front = q->rear = 0; } // 判断队列是否为空 int QueueEmpty(SqQueue *q) { return q->front == q->rear; } // 入队 int EnQueue(SqQueue *q, int x) { if ((q->rear + 1) % MAXSIZE == q->front) return 0; // 队列已满 q->data[q->rear] = x; q->rear = (q->rear + 1) % MAXSIZE; return 1; } // 出队 int DeQueue(SqQueue *q, int *x) { if (q->front == q->rear) return 0; // 队列为空 *x = q->data[q->front]; q->front = (q->front + 1) % MAXSIZE; return 1; } // 输出杨辉三角 void PrintTriangle(int n) { int triangle[MAXSIZE][MAXSIZE]; SqQueue q; InitQueue(&q); // 计算杨辉三角的数值 for (int i = 0; i < n; i++) { // 将第一行的数值入队 EnQueue(&q, 1); // 计算当前行的数值 for (int j = 0; j <= i; j++) { if (j == 0 || j == i) triangle[i][j] = 1; else { int x, y; // 取出队首元素和它的下一个元素 DeQueue(&q, &x); DeQueue(&q, &y); triangle[i][j] = x + y; // 将计算得到的数值入队 EnQueue(&q, y); } // 将当前行的数值入队 EnQueue(&q, triangle[i][j]); printf("%d ", triangle[i][j]); } printf("\n"); } } int main() { int n; printf("Please input the number of rows of the triangle: "); scanf("%d", &n); PrintTriangle(n); return 0; } ``` 这个程序可以输出指定行数的杨辉三角,例如输入6,输出结果如下: ``` Please input the number of rows of the triangle: 6 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值