关于杨辉三角的论述
问题描述
杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数。
它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加。
下面给出了杨辉三角形的前4行:
1
1 1
1 2 1
1 3 3 1
给出n,输出它的前n行。
输入格式
输入包含一个数n。
输出格式
输出杨辉三角形的前n行。每一行从这一行的第一个数开始依次输出,中间使用一个空格分隔。请不要在前面输出多余的空格。
样例输入
4
样例输出
1
1 1
1 2 1
1 3 3 1
数据规模与约定
1 <= n <= 34。
算法分析:
杨辉三角的第i行数据为(a+b)^(i+1)的系数;
故要想输出杨辉三角形,只需输出二项式的系数即可,其难点在于求组合数C(n,m)的值;
以下是求解组合数C(n,m)的值的方法;
第一种方法:利用递归求解(缺点,当n值大时,需耗费大量时间)
算法如下:
int fin(int n,int m)
{
if(m==n)
return 1;
if(m==0)
return 1;
return fin(n-1,m)+fin(n-1,m-1);
}
第二种方法:利用公式求解:
缺点:当n值较大时,超出了int的表示范围
即阶乘无法表示
第三种方法:同样是是利用上述公式,同时结合公式C(n,m)=C(n,n-m);
只不过是在求m*(m-1)*............*(m-n+1)的过程中,去除以(m-n)、(m-n-1).............(1);
这样可以避免求解过程中值过大,而无法表示的情况!
缺点:当n值过大时,该值仍然无法表示;
算法描述:
int c(int n,int k)
{
__int64 i,j,h,sum;
__int64 a[100];
for(i=n,j=1;i>n-k;i--,j++){
a[j]=i;
}
sum=1,h=1;
for(i=1;i<j;i++){
sum=sum*a[i];
while(sum%h==0&&h<=k){
sum=sum/h;
h++;
}
}
return sum;
}
杨辉三角形代码实现:
#include<stdio.h>
int main()
{
int c(int n,int k);
int i,n,k,j;
scanf("%d",&n);
printf("1\n");
for(i=1;i<n;i++){
for(j=0;j<=i/2;j++)
printf("%d ",c(i,j));
if(i%2!=0)
k=i/2;
else
k=i/2-1;
for(j=k;j>=0;j--)
printf("%d ",c(i,j));
printf("\n");
}
return 0;
}
int c(int n,int k)
{
__int64 i,j,h,sum;
__int64 a[100];
for(i=n,j=1;i>n-k;i--,j++){
a[j]=i;
}
sum=1,h=1;
for(i=1;i<j;i++){
sum=sum*a[i];
while(sum%h==0&&h<=k){
sum=sum/h;
h++;
}
}
return sum;
}