C语言计算含N个元素集合的分划个数

以下为计算含n个元素的集合共有多少分划。
如有不当,或者意见或建议,欢迎大家提出!

#include <stdio.h>
int f(int,int []); /*用于递推计算*/
int A(int,int); /*用于计算组合数*/ 
int main()
{
	int n;
	printf("请输入元素个数n:");
	scanf("%d",&n);
	int set[100]={1,1,2};
	int i;
	for(i=3;i<n+1;i++){
		set[i]=f(i,set);
	}
	printf("该集合的分划个数为:%d",set[n]);
	
}
int f(int i,int set[])
{
	int sum=0;
	int j;
	for(j=0;j<i;j++){
		int h=i-1;
		int C=A(h,j);
		sum+=C*set[j];
	}
	return sum;
}
int A(int h,int j)
{
	int a,b,numerator=1,denominator=1;
	for(a=h-j+1;a<h+1;a++){
		numerator*=a;		
	}
	for(b=1;b<j+1;b++){
		denominator*=b;
	}
	int C=numerator/denominator;
	return C;
}

该程序基于公式:
在这里插入图片描述
其中An为含n个元素的集合,Bn为其所含分划个数,
已知B0=1,B1=1,B2=2。
(简要证明思路:An+1比An多出来的一个元素与剩余元素进行分组,借此变为含n个元素的集合,比An-1多出来的两个元素不重合式与剩下元素进行分组,变为含n-1个元素的集合,以此类推,从而建立递推关系)

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值