c语言-杨辉三角的两种输出方法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
c语⾔-杨辉三⾓的两种输出⽅法
c语⾔对杨辉三⾓的简单实现
杨辉三⾓是数字与⼏何的完美融合,杨辉三⾓有着⾮常神奇的排列规律。
下⾯我们来复习以下杨辉三⾓形的特性,并⽤程序来输出杨辉三⾓形。
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
如上,可以看出⼀个很简单的规律:
每个数等于它上⽅两数之和。
每⾏数字左右对称,由1开始逐渐变⼤。
第n⾏的数字有n项。
利⽤这三个规律,我们可以⽤数组来实现杨辉三⾓的排列。
#include <stdio.h>
#define N 14
void main()
{
int i, j, k, n, arr[N][N]; /*定义⼆维数组arr[14][14]*/
do
{
printf("请输⼊要打印的⾏数:");
scanf("%d",&n);
}
while(n<=0||n>=N-1); //对打印⾏数进⾏判断,避免越界
for(i=1;i<=n;i++)
a[i][1] = a[i][i] = 1; //两边的数令它为1,因为现在循环从1开始,就认为a[i][1]为第⼀个数
for(i=3;i<=n;i++)
for(j=2;j<=i-1;j++)
a[i][j]=a[i-1][j-1]+a[i-1][j]; //除两边的数外都等于上⽅两数之和
for(i=1;i<=n;i++){
for(k=1;k<=n-i;k++)
printf(" "); //对打印进⾏排版
for(j=1;j<=i;j++)
printf("%6d",a[i][j]);
printf("\n");
}
return 0;
}
以上就是数组对杨辉三⾓的实现,如果不想使⽤数组还可以利⽤以下规律,进⾏直接打印。
第n⾏的m个数可表⽰为 C(n-1,m-1),即为从n-1个不同元素中取m-1个元素的组合数。
第n⾏的第m个数和第n-m+1个数相等,为组合数性质之⼀。
每个数字等于上⼀⾏的左右两个数字之和。
可⽤此性质写出整个杨辉三⾓。
即第n+1⾏的第i个数等于第n⾏的第i-1个数和第i个数之和,这也是组合数的性质之⼀。
即
C(n+1,i)=C(n,i)+C(n,i-1)。
(a+b)n的展开式中的各项系数依次对应杨辉三⾓的第(n+1)⾏中的每⼀项。
简单来说:
利⽤⼆项式定理来解决。
例如在杨辉三⾓中,第3⾏的三个数恰好对应着两数和的平⽅的展开式的每⼀项的系数,第4⾏的四个数恰好依次对应两数和的⽴⽅的展开式的每⼀项的系数,以此类推。
即:
第n⾏的m个数可表⽰为C(n-1,m-1),即为从n-1个不同元素中取m-1个元素的组合数。
因此可得出⼆项式定理的公式为:
C(n-1,m-1)=(n-1)!/{(m-1)!(n-m)!}
下⾯对这个公式来⼀个简单的实现
int fac(int a) //定义⼀个阶乘函数供combi函数调⽤
{
int i,ret=1; //乘阶的数据量可能会很⼤,可以把ret定义为float,
if(a ==1 || a == 0)
return 1;
else{
for(i=1;i<=a;i++)
ret = ret*i;
return ret;
}
}
void combi(int n)
{
int i,j,k;
for(i=1;i<=n;i++)
{
for(j=1;j<=n-i;j++)
printf(" "); //对输出排版
for(k=1;k<=i;k++)
{
printf("%4d",fac(i-1)/(fac(k-1)*fac(i-k))); //利⽤上述公式进⾏获取杨辉三⾓对应的值
}
printf("\n");
}
}
int main()
{
int n;
printf("请输⼊:");
scanf("%d",&n);
combi(n);
}
可以看出来利⽤⼆项式原理,程序逻辑更加的清晰简洁。
但是乘阶的计算量⽐较⼤,并不赞成使⽤此种⽅法。
关于杨辉三⾓的特性还有很多,有兴趣的还可以进⾏探究。