杨辉三角问题详解
杨辉三角
1、模型介绍
杨辉三角,是二项式系数在三角形中的一种几何排列。在欧洲,这个表叫做帕斯卡三角形。帕斯卡(1623----1662)是在1654年发现这一规律的,比杨辉要迟393年,比贾宪迟600年。杨辉三角是中国古代数学的杰出研究成果之一,它把二项式系数图形化,把组合数内在的一些代数性质直观地从图形中体现出来,是一种离散型的数与形的结合。
下图就是一个杨辉三角(前7行)。
2、问题分析
要打印杨辉三角,我们首先要了解它具有的特性:
1、每个数等于它上方两数之和。(规律)
2、每行数字左右对称,由1开始逐渐变大。 (循环起始值)
3、第n行的数字有n项。(循环限制条件)
我们要构建一个二维数组,再通过循环来实现打印。
3、操作历程
假设我们要按照形式打印杨辉三角的前10行数
数组初始化
我们要先创建一个二维数组。
由于第10行中有10个数(性质3)为防止数组越界,我们可以如下创建与初始化数组。
int a[10][10] = {0};//在循环中用别的数字替换零。
循环实现
1、首先我们可以先使用一个循环来控制行数。
for (int i=0; i<=10; i++)//数组下标从0开始
起始值 限制条件 控制i变化
2、接着我们可以再使用一个循环来控制每行数的个数。
由于杨辉三角中第n行的数字有n项。我们要更改循环的限制条件。
for (int j=0; j<=i; j++)
起始值 限制条件 控制j变化
对每行中的数进行分析。
不难发现,每行中的第一个都是1(性质2),因此可以在循环中将它们赋值为1,
结合上述循环,可以写出如下框架:
*int main()
{
int arr[10][10] = { 0 };
for (int i=0; i<10; i++)
{
arr[i][0] = 1;//每行第一个数赋值为1
for (int j=0; j<=i; j++)
{
}
}
3、最终实现
再对每行中剩下的数进行分析。
可以发现:每个数等于它上方两数之和。(性质1)
假设这个数可以表示为a[i][j],表示它是第i+1行的第j+1个数。(从第二行开始,即i,j>=1)
那么它上面两个数在第i行,是第j个和第j+1个数,它们可以表示为a[i-1][j-1]和a[i-1][j]。
结合杨辉三角性质1,如下代码可得
if (i >= 1 && j >= 1)
{
arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
}
4、源码及结果呈现
源码:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//杨辉三角
int main()
{
int arr[10][10] = { 0 };
for (int i=0; i<10; i++)
{
arr[i][0] = 1;
for (int j=0; j<=i; j++)
{
if (i >= 1 && j >= 1)
{
arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
}
printf(" %-3d", arr[i][j]);//-3表示靠左占三个空位,保证数字分开
}
printf("\n");//每行打印完之后换行
}
return 0;
}
结果呈现:
技术原因,只能靠左的形式呈现。