在 C++ 中使用向量的 Pascal 三角矩阵

Pascal triangle matrix using vectors in C++

我需要使用向量制作帕斯卡三角矩阵,然后打印它。

此算法适用于数组,但不知何故不适用于使用向量的矩阵。

#include <iomanip>
#include <iostream>
#include <vector>

typedef std::vector<std::vector<int>> Matrix;

int NumberOfRows(Matrix m) { return m.size(); }
int NumberOfColumns(Matrix m) {
  if (m.size() != 0)
    return m[0].size();
  return 0;
}

Matrix PascalTriangle(int n) {
  Matrix mat;
  int a;
  for (int i = 1; i <= n; i++) {
    a = 1;
    for (int j = 1; j <= i; j++) {
      if (j == 1)
        mat.push_back(j);
      else
        mat.push_back(a);
      a = a * (i - j) / j;
    }
  }
  return mat;
}

void PrintMatrix(Matrix m, int width) {
  for (int i = 0; i < NumberOfRows(m); i++) {
    for (int j = 0; j < NumberOfColumns(m); j++)
      std::cout << std::setw(width) << m[i][j];
    std::cout << std::endl;
  }
}

int main() {
  Matrix m = PascalTriangle(7);
  PrintMatrix(m, 10);

  return 0;
}

我在屏幕上什么也看不到,这里是相同的代码,只是没有使用向量的矩阵 program(效果很好)。

你能帮我修复这段代码吗?

您的代码无法编译,因为您在 PascalTriangle.

中有很多错误

首先,您初始化一个没有元素的矩阵。此外,您使用从 1 而不是 0 开始的矩阵索引。

以下内容为我打印:

Matrix PascalTriangle(int n) {
  Matrix mat(n, std::vector<int>(n, 0)); // Construct Matrix Properly
  int a;
  for (int i = 0; i < n; i++) { // Start index at 0
    a = 1;
    for (int j = 0; j < i + 1; j++) { // Start index at 0
      if (j == 0) // Changed 1 to 0
        mat[i][j] = 1;
      else
        mat[i][j] = a;
      a = a * (i - j) / (j+1); // Changed j to j+1 since j starts at 0
    }
  }
  return mat;
}

主要问题是,在 PascalTriangle 中,您一开始的行数和列数都是空的 Matrix

由于我的评论提到了 push_back,如果您没有使用传入的元素数初始化 Matrix,这里是使用它的方法。

另一个问题是 NumberOfColumns 应该指定行,而不仅仅是矩阵向量。

最后一个问题是您应该通过 const 引用而不是值来传递 Matrix

解决所有这些问题,结果如下:

Matrix PascalTriangle(int n) 
{
    Matrix mat;
    for (int i = 0; i < n; i++)
    {
        mat.push_back({}); // creates a new empty row
        std::vector<int>& newRow = mat.back(); // get reference to this row
        int a = 1;
        for (int j = 0; j < i + 1; j++) 
        { 
            if (j == 0) 
                newRow.push_back(1);
            else
                newRow.push_back(a);
            a = a * (i - j) / (j + 1); 
        }
    }
    return mat;
}

然后在NumberOfColumns:

int NumberOfColumns(const Matrix& m, int row) 
{
    if (!m.empty())
        return m[row].size();
    return 0;
}

然后,NumberOfRows:

int NumberOfRows(const Matrix& m) { return m.size(); }

最后,PrintMatrix

void PrintMatrix(const Matrix& m, int width) 
{
    for (int i = 0; i < NumberOfRows(m); i++) 
    {
        for (int j = 0; j < NumberOfColumns(m, i); j++)
            std::cout << std::setw(width) << m[i][j];
        std::cout << std::endl;
    }
}

这是一个live demo