我们先来看看杨辉三角长什么样的:
我们一起来看一看它的规则:
1. 每一行的第一个数字和最后一个数字都是1
2. 从第三行开始,中间的数字和最后一个数字等于它上方两个数字之和
我们可以很好的发现下面的数字就是由该数字上面一行和上一列加上该数字的上一行和该数字的那一列,如上图的箭头所示,既然我们找到了规律。
接下来我们就来一步一步的实现我们的代码:上面经过分析,对于数值我们可以用二维数组进行接收,那么这样便于我们对于对于这种我们都轻车熟路的用到两个for循环,外循环表示则表示有多少行,内循环则表示有多少列,我们可以发现我们的列数与我们的行数是相等的。每一行的第一个数字和最后一个数字都是1,那么对于1的实现,在j = 0 时或者 j= i时就规定为1,下面我们以一个7行的杨辉三角为例:
- #define _CRT_SECURE_NO_WARNINGS 1
- #include
-
- int main()
- {
- int arr[7][7] = { 0 };
-
- for (int i = 0; i < 7; i++)
- {
- for (int j = 0; j < i; j++)
- {
- if (j == 0 || j == i)//为1的情况
- {
- arr[i][j] = 1;
- printf("%d ",arr[i][j]);
- }
- else
- {
- arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
- printf("%d ", arr[i][j]);
- }
- }
-
- printf("\n");
-
- }
- return 0;
- }
我们来看看运行效果:
那么上面我们知道:从第三行开始,中间的数字和最后一个数字等于它上方两个数字之和,那么我们可不可以通过函数递归的方法呢:因为我们知道前三个为1,那么计算第i行第j列的数值时,我们可不可以一步一步的推回去呢,答案是可以的!对于1的位置,我们规定为1就好了:
- #define _CRT_SECURE_NO_WARNINGS 1
- #include
-
- int com(int n, int k)
- {
- if (k == 0 || k == n)
- return 1;
- else
- return com(n - 1, k - 1) + com(n - 1, k);//上一行的前一列和本列的上一行
- }
-
- // 打印杨辉三角
- void Triangle(int n)
- {
- for (int i = 0; i < n; i++)
- {
- // 打印每一行的数字
- for (int j = 0; j <= i; j++)
- {
- printf("%d ", com(i, j));
- }
- printf("\n");
- }
- }
-
- int main()
- {
- int n = 0;
-
- printf("请输入要打印的杨辉三角的行数:");
- scanf("%d", &n);
-
- // 调用函数打印杨辉三角
- Triangle(n);
-
- return 0;
- }
我们来看看效果:
杨辉三角有很多的摆法,下面我们来看看这种:
那么我们先来看看前面的空格,前面的空格依次减少,所以我们的空格是跟着行数在变化的:
- for (space = 1; space <= rows - i; space++)
- {
- printf(" "); // 打印空格
- }
后面的数值部分,我们可以用到上面那种方法,这里就不用上面那种方法了,我看见其他的公式:a = a * (i - j + 1) / j
对于这种,我真不知道他们是怎么推导出来的,真的挺佩服他们的!
-
- int main()
- {
- int rows, a = 1, space, i, j;
-
- printf("请输入要打印的行数: ");
- scanf("%d", &rows);
-
- for (i = 0; i < rows; i++)
- {
- for (space = 1; space <= rows - i; space++)
- {
- printf(" "); // 打印空格(两个空格)
- }
-
- for (j = 0; j <= i; j++)
- {
- if (j == 0 || i == 0)
- {
- a = 1;
- }
- else
- {
- a = a * (i - j + 1) / j;
- }
- printf("%4d", a); // 打印系数
- }
-
- printf("\n");//换行
- }
-
- return 0;
- }
看看运行效果:
你们知道是怎么推导出来的吗?教教我呗😳😳😳