首先,鸣谢百度百科~~最简公式是从上面找的233333(请不要鄙视我这个拿来主义~~)
不过并没有给解题思路,只是给了实现的代码,如下图(C语言代码):
<span style="font-size:18px;">#include <stdio.h>
#include <stdlib.h>
int main()
{
int s = 1, h; // 数值和高度
int i, j; // 循环计数
scanf("%d", &h); // 输入层数
printf("1\n"); // 输出第一个 1
for (i = 2; i <= h; s = 1, i++) // 行数 i 从 2 到层高
{
printf("1 "); // 第一个 1
for (j = 1; j <= i - 2; j++) // 列位置 j 绕过第一个直接开始循环
printf("%d ", (s = (i - j) * s / j));
printf("1\n"); // 最后一个 1,换行
}
getchar(); // 暂停等待
return 0;
}</span>
这个代码没有很好的排版,因为我本来做的是PHP练习,所以我抄上去了核心部分并且自己改良了输入输出,如下图:
<span style="font-size:18px;"><?php
$sum=1;
$line=5;
for($k=0;$k<$line-1;$k++){
echo " ";
}
echo "1<br/>";
for($i=2;$i<=$line;$i++){
for($k=0;$k<($line-$i);$k++){
echo " ";
}
echo "1 ";
for($j=1;$j<=$i-2;$j++){
$sum=(($i-$j)/$j)*$sum;
echo "$sum";
if($sum<10){
echo " ";
}
else if(($sum>=10)&&($sum<100)){
echo " ";
}
else{
echo " ";
}
}
echo "1<br/>";
$sum=1;
}
?></span>
输出效果如图:
从这张图可以看到,输出到13行(行数从1开始算起)的时候是比较正常的排版,14行的时候就不行了。原因在于我对于空格的动态输出只停留在了三位数的基础上而忽略了四位数(第14行出现了四位数),所以导致排版变乱。不过这次操作也没要求太高,所以关于输出这方面我就不讲太多了。
下面要讲的是核心公式:s = ( i - j ) / j * s 的原理了。
这个公式来源于杨辉三角的第5条定理(基本性质中的第五条),也是杨辉三角的核心定理之一:第n行的m个数可表示为C(n-1,m-1),即为从n-1个不同元素中取m-1个元素的组合数。()
这个公式乍一看很抽象,但是等我仔细说你就不觉得抽象了。
这个公式中的 i 和 j 分别对应二项式定理里面的 n 和 r。
具体拿一个数来讲解会比较好,就拿第七行第二个数来说,按照杨辉三角C(n-1,m-1)的公式,n-1为6,m-1为1,那么结果为6,对应的杨辉三角数为6(C61),公式计算结果也为6((7 - 1) / 1 * 1)。那么第七行第三个数为(C62 = 6 * 5 / 2),公式计算为((7 - 2)/ 2 * 6)。从这个公式可以看出,代码中的s存储的是上一个数,也就是6,后面的5用(7 - 2)表示,也就是(i - j),这里的 2 用 j 来表示,以此类推,s存储上一次的数值,(i - j)/ j 用来表示这一次新增加的数值,两者相乘构成了这一次的数字。
如果还不明白的话建议看看二项式定理,杨辉三角与之互通。二项式定理相较之更容易理解,因为它更不抽象。
os:表示这个代码真的是我看过的最简单的代码了。