杨辉三角问题详解

杨辉三角问题详解

杨辉三角

1、模型介绍

杨辉三角,是二项式系数在三角形中的一种几何排列。在欧洲,这个表叫做帕斯卡三角形。帕斯卡(1623----1662)是在1654年发现这一规律的,比杨辉要迟393年,比贾宪迟600年。杨辉三角是中国古代数学的杰出研究成果之一,它把二项式系数图形化,把组合数内在的一些代数性质直观地从图形中体现出来,是一种离散型的数与形的结合

下图就是一个杨辉三角(前7行)。
杨辉三角问题详解_第1张图片

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
//杨辉三角
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;
}

结果呈现:
杨辉三角问题详解_第2张图片
技术原因,只能靠左的形式呈现。

你可能感兴趣的:(c语言)