在 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
我需要使用向量制作帕斯卡三角矩阵,然后打印它。
此算法适用于数组,但不知何故不适用于使用向量的矩阵。
#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