目录
我们先以6*6的为例,文章尾有更普遍的方法
#include<stdio.h>
int main()
{
int arr[6][6];//创建6*6的二维数组
for (int i = 0; i < 6; i++)
{
for (int j = 0; j < 6; j++)
{
arr[i][j] = 1;
}
}//将二维数组中所有元素初始化为1
for (int i = 1; i < 6; i++)
{
for (int j = 1; j < i; j++)
{
arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];
}
}//该元素=该元素上面的元素+该元素上面的元素的前面一个元素
for (int i = 0; i < 6; i++)
{
for (int j = 0; j < 15 - 3 * i; j++)
printf(" ");//将对角线布满空格
for (int j = 0; j <= i; j++)
printf("%6d", arr[i][j]);//将加完后的二维数组,只打印其左下角
printf("\n");
}
return 0;
}
先说一下思路
1.第一步:
通过两层循环,遍历二维数组,将其都赋值为1。
int arr[6][6];
for (int i = 0; i < 6; i++)
{
for (int j = 0; j < 6; j++)
{
arr[i][j] = 1;
}
}
2.第二步
j<i,只取数组行大于列的部分
for (int j = 1; j < i; j++)
3.第三步
这是小学时学过的规律,
得到该公式尤为重要,
该元素=该元素上面的元素+该元素上面的元素的前面一个元素,
arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];
在二维数组中实现的方式
将最终我们要输出的结果与现在对比,数值上是相同的,现在我们将格式变化。
4.第四步
这里的格式(j<15-3*i)是最多样的,不同规格的杨辉三角形有不同的大小,这里的答案也不唯一,可以将间距弄小点也可弄大点,主要看你要打印的杨辉三角的规格。
但有几点是可以确定的,(1) 15的是需要不小于 k * i(k为这里的3,也是i的系数)的最大值。(2)k的增大与减小会影响前面的空格数量,效果如此。
for (int j = 0; j < 15 - 3 * i; j++)
printf(" ");
该行代码是需要打印蓝色阴影区域的空格,右边的黑块不用做任何操作,打印完一行最后的元素后,及时的换行。
将下面的域宽%6d,先写出来,在根据上面我给出的规律,对(n-k*i)尝试几个值,很容易尝试出来。
当然如果你不希望多次尝试,我也将规律总结出来,(3*N-3*i),N为你定义杨辉三角形的大小。
5.第五步
for (int j = 0; j <= i; j++)
printf("%6d", arr[i][j]);
printf("\n");
(1) j<i,只取数组行大于列的部分,也就是上面利用杨辉三角公式的部分二维数组。
(2)%6d,域宽为6,右对齐,直接写6即可,不必更改。
普遍方案(答案)
上面是思路,根据思路,我们总结出更加普遍的方法(更改宏定义中N的大小即可)
#include<stdio.h>
#define N 8
int main()
{
int arr[N][N];
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
arr[i][j] = 1;
}
}
for (int i = 1; i < N; i++)
{
for (int j = 1; j < i; j++)
{
arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];
}
}
for (int i = 0; i < N; i++)
{
for (int j = 0; j < 3*N - 3 * i; j++)
printf(" ");
for (int j = 0; j <= i; j++)
printf("%6d", arr[i][j]);
printf("\n");
}
return 0;
}