C语言-杨辉三角

什么是杨辉三角?

如下是一个6行的杨辉三角,每个数字等于上方两数字之和。

1
2
3
4
5
6
      1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1

注意:以下方法只是实现了杨辉右三角,如以下:

1
2
3
4
5
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1

方法一

使用二维数组存储整个杨辉三角

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
#define N 10 // 定义杨辉三角的行数

int main()
{
int arr[N][N] = { 0 };
int i, j;

for (i = 0; i < N; i++)
{
for (j = 0; j <= i; j++)
{
if (i == j || j == 0) // 如果是第一列或者对角线上的元素,则赋值为1
{
arr[i][j] = 1;
}
else // 否则,根据杨辉三角的规律,计算当前位置上方两个元素之和
{
arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];
}
}
}

for (i = 0; i < N; i++) // 输出杨辉三角
{
for (j = 0; j <= i; j++)
{
printf("%-3d ", arr[i][j]);
}
printf("\n");
}

return 0;
}

详解

使用二维数组存储整个杨辉三角。在外层循环中,我们用变量 i 从 0 循环到 N-1,控制杨辉三角的行数;在内层循环中,我们用变量 j 从 0 循环到 i,控制杨辉三角每一行中元素的个数。
在计算杨辉三角的过程中,我们判断当前位置是否是第一列或者对角线上的元素,如果是则赋值为1,否则根据杨辉三角的规律,计算当前位置上方两个元素之和,并将结果赋给当前位置。最后,我们使用两重循环遍历整个数组并输出每个元素,使用%-3d格式化字符串来保证每个数字占据 3 个字符的宽度并且左对齐,最后换行。

方法二

使用一维数组存储每一行的元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#define N 6 // 杨辉三角的行数

int main()
{
int arr[N] = { 0 };
arr[0] = 1;
int i, j;

for (i = 0; i < N; i++)
{
for (j = i; j >= 1; j--) // 每个元素的值等于它正上方的元素加左上角的元素之和
{
arr[j] = arr[j] + arr[j - 1];
}
for (j = 0; j <= i; j++) // 输出当前行的所有元素
{
printf("%-4d", arr[j]);
}
printf("\n");
}

return 0;
}

详解:

使用一维数组存储每一行的元素。外层循环遍历杨辉三角的每一行,内层循环分别计算当前行的元素值和输出当前行的所有元素。第二层循环计算当前行的元素值,对于每一行的第i个元素(i从0开始计数),它的值等于 arr[j] + arr[j-1],其中j从i循环到1(左上角的元素),从而计算当前行的所有元素。