算法竞赛入门经典:第十章 数学概念与方法 10.6递推之杨辉三角

/*
杨辉三角与二项式定理:
组合数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个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值