现在有一个经典的问题,用C/C++输出“杨辉三角”。
1.程序前分析
1.1什么是杨辉三角?
杨辉三角是二项式系数在三角形中的一种几何排列.1、每行数字左右对称,由1开始逐渐变大,然后变小,回到1.2、第n行的数字个数为n个.3、第n行数字和为2^(n-1).4、每个数字等于上一行的左右两个数字之和.可用此性质写出整个杨辉三角形.5、将第2n+1行第1个数,跟第2n+2行第3个数、第2n+3行第5个数……连成一线,这些数的和是第2n个斐波那契数.将第2n行第2个数,跟第2n+1行第4个数、第2n+2行第6个数……这些数之和是第2n-1个斐波那契数.6、第n行的第1个数为1,第二个数为1×(n-1),第三个数为1×(n-1)×(n-2)/2,第四个数为1×(n-1)×(n-2)/2×(n-3)/3…依此类推.
1.2程序假定
已经知道了什么是杨辉三角,我们就可以开始设计程序了。假定我们使用 visual studio 进行程序编写,假定我们需要输出20行的杨辉三角(考虑了输出窗口的大小,实际上20阶也很够用了),输出标准的对齐的杨辉三角。
2.程序设计
考虑到杨辉三角的性质,我们可以用数组 a[n][n] 来存放数据,再由杨辉三角的性质可知: a[i][j] = a[i - 1][j - 1] + a[i - 1][j] (非边界时成立) & a[i][j] = 1 (位于边界时成立)。我们便据此设计程序。
2.1外围设计
先写好程序的框架,根据假定的输出20阶杨辉三角,假定输出的行标号为 i 、数据输出量 j 、标准辅助量 k 以及存放数据的数组 a[n][n](后面要用到i、j、k 和 a[n][n])。写好程序框架后填入得初步程序设计:
#include<stdio.h>
#pragma warning (disable:4996)
#define n 20
int main()
{
int i, j, k;
int a[n][n];
for (i = 0; i < n; i++)
{
}
return 0;
}
2.2内圈程序设计
2.2.1标准输出设计
想要达到标准输出,就需要先知道需要输出的阶数(我们假定的n=20),然后输出对应数量的占位空格。分析可知:第 i 行对应的占位次数就是 n-i 次。暂定占位空格的空格数为 3 ,则标准输出程序设计为(参数含义在前面均已说明):
for (k = 0; k < n - 1 - i; k++)
printf(" ");
2.2.2程序关键部分设计
接下来就要设计数字量的输出了,在此之前,我们需要得到数字量并存放到数组 a[n][n] 里。由分析可知: 位于边界时有: a[i][j] = 1;位于非边界时有:a[i][j] = a[i - 1][j - 1] + a[i - 1][j] 。我们便据此设计程序(6宽域输出与前面的3空格占位相对应):
for (j = 0; j <= i; j++)
{
if (i == 0 || j == 0 || j == i)
a[i][j] = 1;
else a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
printf("%6d", a[i][j]);// 6宽域输出
}
printf("\n");
3.最终程序
如此,我们的程序就设计好了。具体如下:
#include<stdio.h>
#pragma warning (disable:4996)
#define n 20
int main()
{
int i, j, k;
int a[n][n];
for (i = 0; i < n; i++)
{
for (k = 0; k < n - 1 - i; k++)
printf(" ");
for (j = 0; j <= i; j++)
{
if (i == 0 || j == 0 || j == i)
a[i][j] = 1;
else a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
printf("%6d", a[i][j]);
}
printf("\n");
}
return 0;
}
程序的运行结果如下:
各位读者也可以根据自己的需求对程序进行改进。另外,如果有任何疑问,评论区和私信都欢迎你。