C 奇怪输出中的帕斯卡三角形
Pascal's triangle in C weird output
我正在尝试编写一个程序来显示 Pascal 的三角形直到用户输入的级别数。我们不允许使用阶乘法。我当前的代码是这样的:
#include <stdio.h>
void trianglePrint(const int numLevels);
int main() {
int numLevels;
printf("Please enter how many levels of Pascal's Triangle you would
like to see: ");
scanf("%d", &numLevels);
trianglePrint(numLevels);
return 0;
}
void trianglePrint(const int numLevels) {
int pascalTriangle[28][28];
int i, j;
for (i = 0; i < numLevels; ++i) {
for (j = 0; j <= i; ++j) {
if (i == 0 || i == 1 || j == 0 || j == numLevels) {
pascalTriangle[i][j] = 1;
printf("%d ", pascalTriangle[i][j]);
}
else {
pascalTriangle[i][j] = pascalTriangle[i - 1][j - 1] +
pascalTriangle[i - 1][j];
printf("%d ", pascalTriangle[i][j]);
}
}
printf("\n");
}
}
我们最多只能达到 28 个级别,这就是为什么我在两个维度上都使用大小为 28 的数组的原因。
这适用于大约 6 个三角形级别,但对于更大的级别,它会给出非常大的整数。我认为这是由于未初始化的数组造成的,但我不确定。有谁知道错误在哪里?
问题是您在 else
子句中使用它计算 pascalTriangle[i][j]
之前没有设置 pascalTriangle[i - 1][j]
。
如果你改变
if (i == 0 || i == 1 || j == 0 || j == numLevels)
至
if (i == 0 || i == 1 || j == 0 || j == i)
(感谢 Melpomene),然后所有对数组的访问都将在已经初始化的成员上结束。
这解决了奇怪的数字。
输出:
Please enter how many levels of Pascal's Triangle you would like to see: 6
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
Process returned 0 (0x0) execution time : 2.264 s
Press any key to continue.
注:
初始化数组也是一个明智的预防措施。您可以使用有助于发现错误的值进行初始化,而不是隐藏它,例如42.
试试代码
void Pascal(int n)
{
int arr[n][n];
for (int i = 0; i < n; i++)
{
for (int j = 0; j <= i; j++)
{
// First and last values in every row are 1
if (i == j || j == 0)
arr[i][j] = 1;
else // Other values are sum of values just above and left of above
arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
我正在尝试编写一个程序来显示 Pascal 的三角形直到用户输入的级别数。我们不允许使用阶乘法。我当前的代码是这样的:
#include <stdio.h>
void trianglePrint(const int numLevels);
int main() {
int numLevels;
printf("Please enter how many levels of Pascal's Triangle you would
like to see: ");
scanf("%d", &numLevels);
trianglePrint(numLevels);
return 0;
}
void trianglePrint(const int numLevels) {
int pascalTriangle[28][28];
int i, j;
for (i = 0; i < numLevels; ++i) {
for (j = 0; j <= i; ++j) {
if (i == 0 || i == 1 || j == 0 || j == numLevels) {
pascalTriangle[i][j] = 1;
printf("%d ", pascalTriangle[i][j]);
}
else {
pascalTriangle[i][j] = pascalTriangle[i - 1][j - 1] +
pascalTriangle[i - 1][j];
printf("%d ", pascalTriangle[i][j]);
}
}
printf("\n");
}
}
我们最多只能达到 28 个级别,这就是为什么我在两个维度上都使用大小为 28 的数组的原因。
这适用于大约 6 个三角形级别,但对于更大的级别,它会给出非常大的整数。我认为这是由于未初始化的数组造成的,但我不确定。有谁知道错误在哪里?
问题是您在 else
子句中使用它计算 pascalTriangle[i][j]
之前没有设置 pascalTriangle[i - 1][j]
。
如果你改变
if (i == 0 || i == 1 || j == 0 || j == numLevels)
至
if (i == 0 || i == 1 || j == 0 || j == i)
(感谢 Melpomene),然后所有对数组的访问都将在已经初始化的成员上结束。
这解决了奇怪的数字。
输出:
Please enter how many levels of Pascal's Triangle you would like to see: 6
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
Process returned 0 (0x0) execution time : 2.264 s
Press any key to continue.
注:
初始化数组也是一个明智的预防措施。您可以使用有助于发现错误的值进行初始化,而不是隐藏它,例如42.
试试代码
void Pascal(int n)
{
int arr[n][n];
for (int i = 0; i < n; i++)
{
for (int j = 0; j <= i; j++)
{
// First and last values in every row are 1
if (i == j || j == 0)
arr[i][j] = 1;
else // Other values are sum of values just above and left of above
arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
printf("%d ", arr[i][j]);
}
printf("\n");
}
}