(一) 基本概念:
杨辉三角,是二项式系数在三角形中的一种几何排列,中国南宋数学家杨辉1261年所著的《详解九章算法》一书中出现。在欧洲,帕斯卡(1623----1662)在1654年发现这一规律,所以这个表又叫做帕斯卡三角形。帕斯卡的发现比杨辉要迟393年,比贾宪迟600年。
(二)经典例题
题目:输出
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
……
方法1:头铁法(水滴石穿):
思路:一行一行去实现:
#include <stdio.h>
int main() {
//可以初始化,也可以不初始化
int a[36] =
{
0,0,0,0,0,0
,0,0,0,0,0,0
,0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0
};
//赋值
for (int i = 0; i <5; i++)
{
for (int j = i; j >=0; j--) {
if (j == 0 || j == i)
{
a[j] = 1;
printf("%d", a[j]);
}
else
{
a[j] += a[j - 1];
printf("%d", a[j]);
}
}
printf("\n");
}
return 0;
}
方法2 二维数组:
思路:用二维数组去存放数据,无关位置用0代替,最后可以不输出,其余按规律赋值
#include <stdio.h>
int main() {
//可以赋值,也可不赋值 ,默认初始化为0;
int a[5][5] =
{
};
//赋值
for (int i= 0; i < 5; i++)
{
for (int j = 0; j <=i; j++) {
if (j == 0 || i == j)
{
a[i][j] = 1;
}
else
{
a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
}
}
}
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5 ; j++) {
if (a[i][j] != 0)
{
printf(" %d", a[i][j]);
}
} printf("\n");
}
return 0;
}
其中,a[i][j] 的i,j为所实现的二维数组的行列,依题意可得
方法3:一维数组实现:符合这个规律的杨辉三角的通式,m为行列元素。
思路找规律:
j i 0~ 4
0 00000 1
1 00000 1 1
2 00000 ->1 2 1
3 00000 1 3 3 1
4 00000 1 4 6 4 1
可以看出:凡j==0或者i==j时 a[]均为1;
怎么表示? --》条件语句 if (j == 0||j == i)
{
a[pos + j] = 1; //j用来控制每一行要打印的个数及pos位置变化
}
有效数字其他规律:等于其前一行的数+前一行的数的前一个
怎么表示? --》
else {
a[pos + j] = a[pos + j - m] + a[pos + j - m-1];
ispos++;
}
最后无效数字不打印!
#include <stdio.h>
#define m 6 //按题目修改
int main() {
//赋不赋值无所谓,反正默认初始化为0
int a[100] = { };//MaxSize理应设计很大
//赋值
//是否进行for循环的标志
for (int i = 0, pos = 0; i <m; i++)
{
for (int j = 0; j <= i; j++) {
if (j == 0||j == i)
{
a[pos + j] = 1;
}
else
{
a[pos + j] = a[pos + j - m] + a[pos + j - m-1];
ispos++;
}
}
pos += m;
}
// 打印
for ( int i = 0,boo=1 ; i<m*m ; i++)
{
if (a[i] != 0)
{
printf("%d ", a[i]);
}
//每m次换个行
if (boo % m == 0)
{
putchar('\n');
}
boo++;
}
return 0;
}
其他杨辉三角: