/*
杨辉三角与二项式定理:
组合数C上m下n。与组合数最重要的两个东西:杨辉三角和二项式定理
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
将(a+b)^n展开,得到关于x的多项式:
(a+b)^0 = 1
(a+b)^1 = a + b
(a+b)^2 = a^2 + 2ab + b^2
系数和杨辉三角一直
(a+b)^n = 0到n求和C上k下n a^(n-k)*b^k
给定n,如何求出(a+b)^n中所有项的系数?
用递推
输入:
6
输出:
1 6 15 20 15 6 1
*/
/*
关键
1 for(int i = 0 ; i <= n ; i++)
{
iMatrix[i][0] = 1;//需要把每行第一个数的更新放到大循环里面
for(int j = 1 ; j <= n ; j++)
{
int s = iMatrix[i-1][j-1];//行下标为负,为什么还等于值0
iMatrix[i][j] = iMatrix[i-1][j-1] + iMatrix[i-1][j];//时间复杂度是O(n^2),虽然只用得上第n行n+1个元素,却把n行O(n^2)个元素全部计算一遍
}
}
2 iArr[0] = 1;//这里按照C上0下n=0,因此系数必须从0开始
3 iArr[i] = iArr[i-1]*(n-i+1)/i;//利用公式C上k下n = (n-k+1)/k*C上k-1下n,利用公式来递推
4 for(int i = 0 ; i <= n; i++)//注意第n行有n+1个数
*/
#include <stdio.h>
#include <string.h>
#define MAXSIZE 100
int iMatrix[MAXSIZE][MAXSIZE];
void yanghuiRectangle(int n)
{
memset(iMatrix,0,sizeof(iMatrix));
for(int i = 0 ; i <= n ; i++)
{
iMatrix[i][0] = 1;//需要把每行第一个数的更新放到大循环里面
for(int j = 1 ; j <= n ; j++)
{
int s = iMatrix[i-1][j-1];//行下标为负,为什么还等于值0
iMatrix[i][j] = iMatrix[i-1][j-1] + iMatrix[i-1][j];//时间复杂度是O(n^2),虽然只用得上第n行n+1个元素,却把n行O(n^2)个元素全部计算一遍
}
}
for(int j = 0 ; j <= n;j++)
{
printf("%d ",iMatrix[n][j]);
}
printf("\n");
}
void yanghuiRectangle_equation(int n)
{
int iArr[1000];
memset(iArr,0,sizeof(iArr));
iArr[0] = 1;//这里按照C上0下n=0,因此系数必须从0开始
for(int i = 1 ; i <= n ;i++)
{
iArr[i] = iArr[i-1]*(n-i+1)/i;//利用公式C上k下n = (n-k+1)/k*C上k-1下n,利用公式来递推
}
for(int i = 0 ; i <= n; i++)//注意第n行有n+1个数
{
if(i)
{
printf(" %d",iArr[i]);
}
else
{
printf("%d",iArr[i]);
}
}
printf("\n");
}
void process()
{
int n;
while(EOF != scanf("%d",&n))
{
//yanghuiRectangle(n);
yanghuiRectangle_equation(n);
}
}
int main(int argc,char* argv[])
{
process();
getchar();
return 0;
}
算法竞赛入门经典:第十章 数学概念与方法 10.6递推之杨辉三角
最新推荐文章于 2022-03-14 10:22:51 发布