编程基础 - 队列实例 - 杨辉三角 (Pascal’s Triangle)

编程基础 - 队列实例 - 杨辉三角 (Pascal’s Triangle)

返回分类:全部文章 >> 基础知识

返回上级:编程基础 - 队列(Queue)


文章目录

  • 编程基础 - 队列实例 - 杨辉三角 (Pascal's Triangle)
    • 1 杨辉三角简述 (Introduction)
    • 2 C++完整代码 (C++ Code)
    • 3 输出结果 (Output)


1 杨辉三角简述 (Introduction)

杨辉三角,是二项式系数在三角形中的一种几何排列。

(提示:在CSDN的手机app中,公式有可能出现乱码,如果出现乱码请使用网页)

其二项式为:

( x + y ) n = C n 0 x n y 0 + C n 1 x n − 1 y 1 + ⋯ + C n n x 0 y n = ∑ i = 0 n C n i x i y n − i (x+y)^n = C_n^0 x^n y^0 + C_n^1 x^{n-1} y^1 + \cdots + C_n^n x^0 y^n = \sum_{i=0}^n C_n^i x^i y^{n-i} (x+y)n=Cn0xny0+Cn1xn1y1++Cnnx0yn=i=0nCnixiyni

其三角结构为:

1 1 n = 1 1 2 1 n = 2 1 3 3 1 n = 3 1 4 6 4 1 n = 4 1 5 10 10 5 1 n = 5 1 6 15 20 15 6 1 n = 6 ⋮ ⋮ 1 C i 1 C i 2 ⋯ ⋯ C i i − 2 C i i − 1 1 n = i \begin{array}{cc} 1 \quad 1 & n=1 \\ 1 \quad 2 \quad 1 & n=2 \\ 1 \quad 3 \quad 3 \quad 1 & n=3 \\ 1 \quad 4 \quad 6 \quad 4 \quad 1 & n=4 \\ 1 \quad 5 \quad 10 \quad 10 \quad 5 \quad 1 & n=5 \\ 1 \quad 6 \quad 15 \quad 20 \quad 15 \quad 6 \quad 1 & n=6 \\ \vdots & \vdots \\ 1 \quad C_i^1 \quad C_i^2 \quad \cdots \quad \cdots \quad C_i^{i-2} \quad C_i^{i-1} \quad 1 & n = i \\ \end{array} 111211331146411510105116152015611Ci1Ci2Cii2Cii11n=1n=2n=3n=4n=5n=6n=i


2 C++完整代码 (C++ Code)

// Pascal's Triangle
// Author: https://blog.csdn.net/DarkRabbit

#include  // 字符串
#include  // 向量列表
#include  // 队列

#include  // 错误库
#include 

using namespace std;

// 杨辉三角
// params:
//      n:          杨辉三角行数
//      output:     保存每一行结果
void PascalsTriangle(int n, vector<vector<int>>& output)
{
    if (n <= 0)
    {
        throw invalid_argument("n");
    }

    queue<int> coefs; // 系数队列 coeffient queue
    vector<int> lineCoefs; // 存储每一行系数

    // 入队第一行系数
    coefs.push(0); // 用于计算的头虚部
    coefs.push(1);
    coefs.push(1);
    lineCoefs.push_back(1);
    lineCoefs.push_back(1);
    output.push_back(lineCoefs);

    // 逐行循环,计算i+1行系数
    for (int i = 1; i < n; i++)
    {
        lineCoefs.clear(); // 清空当前行
        coefs.push(0); // 用于计算的尾虚部

        // 计算i+1行的系数,例如i=1时,下面循环的计算结果为:
        // 循环之前队列: '0' 1 1 '0' // 第i行尾部'0'即上一句代码入队
        // 循环之后队列:'0' 1 2 1    // 第一个'0'是第i行尾部的'0'
        for (int ci = 0; ci < i + 2 ; ci++)
        {
            int coef = coefs.front(); // 取i行队头
            coefs.pop(); // 队头出队
            coef += coefs.front(); // 计算i+1行系数

            coefs.push(coef); // 入队i+1行系数
            lineCoefs.push_back(coef);
        }

        output.push_back(lineCoefs); // 保存i+1行结果
    }
}

// 主函数
int main()
{
    int n;

    while (true)
    {
        // 输入n
        cout << "杨辉三角,输入大于0的行数:";
        while (!(cin >> n) || n < 1)
        {
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
            cout << "输入有误,重新输入:";
        }

        vector<vector<int>> output; // 定义结果
        PascalsTriangle(n, output); // 求解杨辉三角

        // 打印所有结果
        cout << "输出结果:" << endl;
        for (int i = 0; i < output.size(); i++)
        {
            cout << (i + 1) << ": ";
            for (int ci = 0; ci < output[i].size(); ci++)
            {
                cout << output[i][ci] << " ";
            }
            cout << endl;
        }
        cout << endl;

        cout << "输入'q'退出程序,其它继续:";
        string exit;
        cin >> exit;
        if (exit == "q")
        {
            break;
        }
    }

    system("pause");
    return 0;
}

3 输出结果 (Output)

杨辉三角,输入大于0的行数:abc
输入有误,重新输入:6
输出结果:
1: 1 1
2: 1 2 1
3: 1 3 3 1
4: 1 4 6 4 1
5: 1 5 10 10 5 1
6: 1 6 15 20 15 6 1

输入'q'退出程序,其它继续:10
杨辉三角,输入大于0的行数:10
输出结果:
1: 1 1
2: 1 2 1
3: 1 3 3 1
4: 1 4 6 4 1
5: 1 5 10 10 5 1
6: 1 6 15 20 15 6 1
7: 1 7 21 35 35 21 7 1
8: 1 8 28 56 70 56 28 8 1
9: 1 9 36 84 126 126 84 36 9 1
10: 1 10 45 120 210 252 210 120 45 10 1

输入'q'退出程序,其它继续:q
请按任意键继续. . .


你可能感兴趣的:(基础知识)