题目
问:
在屏幕上打印杨辉三角
1
1 1
1 2 1
1 3 3 1
……
输入描述:
输入为一行,输入一个整数5
,表示5
行杨辉三角
输出描述:
输出5
行杨辉三角
解法
1. 确定思路
- 杨辉三角,是二项式系数在三角形中的一种几何排列,可以观察到外层都是
1
- 从第二行开始,除了外层的
1
之外的数字都是上一层相邻两数之和 - 在观察要求打印的排列方式,类似于三角形,那我们就当做一个二维数组来打印就好了
2. 编写代码
- 根据上述思路,我们定义一个
5
行5
列的二维数组
对应代码:
int arr[5][5] = { 0 };
- 给这个二维数组初始化,先针对外层的
1
。可以观察到,只要是第一列和对角线上的元素都是1
对应代码:
if (i == j || j == 0)
arr[i][j] = 1;
- 当1都初始化好了,其他内层元素都是它上面的元素以及左上角元素之和
对应代码:
if (i > 1 && j < i)
{
arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];
}
- 由于是遍历初始化二维数组,所以需要再嵌套循环
对应代码:
for (int i = 0; i < 10; i++)
{
for (int j = 0; j <= i; j++)
{
if (i == j || j == 0)
arr[i][j] = 1;
if (i > 1 && j < i)
{
arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];
}
}
}
- 功能已经实现,关键在于打印!我们刚刚分析的时候是把杨辉三角当做左下三角矩阵分析的,但是打印的时候要打成金字塔似的才接近完美
- 于是每行打印之前都要打印相应数量的空格
对应代码:
for (int i = 0; i < 5; i++)
{
for (int k = 0; k < 4 - i; k++)
printf(" ");
for (int j = 0; j < 5; j++)
printf("%.d ", arr[i][j]);
printf("\n");
}
- 咱们看看打印结果:
附上完整代码:
#include<stdio.h>
//杨辉三角
int main()
{
int arr[5][5] = { 0 };
for (int i = 0; i < 10; i++)
{
for (int j = 0; j <= i; j++)
{
if (i == j || j == 0)
arr[i][j] = 1;
if (i > 1 && j < i)
{
arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];
}
}
}
for (int i = 0; i < 5; i++)
{
for (int k = 0; k < 4 - i; k++)
printf(" ");
for (int j = 0; j < 5; j++)
printf("%.d ", arr[i][j]);
printf("\n");
}
return 0;
}