杨辉三角
- 我们不讲数学,就讲它的实现吧。
- (1)观察下图,我们知道,杨辉三角,中间不是 1 的数,它的值,等于它肩上两个数字的和。利用这一点规律,我们就可以构造出代码,写出中间的数 。
- (2)再看下面的这个形式的:
- 我们得出 可以用二维数组表示杨辉三角,并观察这个图,结合二维数组中元素的下标,成功找到,上面的规律(肩上数之和)的代码表示!
- 根据图中的规律很容易推敲出来,例如: a[8][3] = a[7][2] + a[7][3] , 再写个循环,就可以求每行的数的值
- (3) 关于 两边数字 1 的规律,那就更容易发现了。 分别是第一个后最后一个。 那么 还举例子: 第 i行, a[i][0] = 1, a[i][i] = 1 就实现了两边为 1 了~
C语言实现
- 根据上面的分析,我们分解步骤:
- (1) 我们发现他其实是一个 正方形,然后只有下三角(如图的直角三角形),所以我们首先构造出来一个 n 乘 n的 二维数组,用它来存储 杨辉三角。
// 打印100行杨辉三角
#include<stdio.h>
int main()
{
int yang[50][50] = {0};
int i, j, m;
// 打印杨辉三角
for(i=0; i<50; i++)
{
// 这里只打印二维数组的杨辉三角部分没所以 j <= i
for(j=0; j<=i; j++)
{
m = yang[i][j];
printf("%d", m);
}
printf("\n");
}
return 0;
}
如图:运行结果
- (2) 我们接着打印出来两边的 1, 记住这个1 的规律。 它是在 一行中的 行首和行尾出现的
// 打印100行杨辉三角
#include<stdio.h>
int main()
{
int yang[25][25] = {0};
int i, j, m;
// 补充代码打印杨辉三角两边的 1
// 输出每行的1,位置是行首和 行尾,对应的下标是 [][0] , [][i]. i为当前行,以0开始
for(i=0; i<25; i++)
{
yang[i][0] = 1;
yang[i][i] = 1;
}
// 打印杨辉三角
for(i=0; i<25; i++)
{
for(j=0; j<=i; j++)
{
m = yang[i][j];
printf("%d", m);
}
printf("\n");
}
return 0;
}
运行结果:
** (3) 第三步,就到了关键的 中间部分的打印了,参考上面的正三角那张图片,我们知道, 下面的数,等于它肩膀上 两个数的和。那么根据此规律,又可以继续写代码实现了!
第三步写完,也是所有代码都写完啦
// 打印100行杨辉三角
#include<stdio.h>
int main()
{
int yang[25][25] = {0};
int i, j, m;
// 输出每行的1,位置是行首和 行尾,对应的下标是 [][0] , [][i]. i为当前行,以0开始
for(i=0; i<25; i++)
{
yang[i][0] = 1;
yang[i][i] = 1;
// 补充代码,打印一行中间的数字
for(j=1; j<i; j++)
{
// 注意 j的取值,从每行的第二个数字,到倒数第二个数字,因为第一个最后的数字是 1固定的
// 按照数的值 是它肩上两个数的和
yang[i][j] = yang[i-1][j-1] + yang[i-1][j];
}
}
// 打印杨辉三角
for(i=0; i<25; i++)
{
for(j=0; j<=i; j++)
{
m = yang[i][j];
printf("%d ", m); // 为了格式好看,我们在这里加上两个空格,隔开数字!!!
}
printf("\n");
}
return 0;
}
打印结果看看!
- 是成功的,不过结果有点乱,终端里的排版不是很好!