重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
#includestdio.h
目前创新互联已为1000+的企业提供了网站建设、域名、网页空间、网站托管、企业网站设计、长葛网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
unsigned long factorial(int n);
unsigned long combination(int n,int m);
int main() {
int n,m;
scanf("%d%d",n,m);
printf("combination(%d,%d) = %u\n",n,m,combination(n,m));
return 0;
}
unsigned long combination(int n,int m) {
unsigned long res = 1;
res = factorial(n)/((factorial(n - m) * factorial(m)));
return res;
}
unsigned long factorial(int n) {
int i;
unsigned long f = 1;
for(i = 1;i = n;i++)
f *= i;
return f;
}
C(5,3)=C(5,2)=5*4/2*1=20/2=10。一般上面的数字超过了下面的一半,先化简。比如:
C(10,7)=C(10,3)=10*9*8/3*2*1=720/6=120。
组合的定义:从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数。用符号 C(n,m) 表示。
计算公式:
扩展资料:
排列、组合、二项式定理公式口诀:
加法乘法两原理,贯穿始终的法则。与序无关是组合,要求有序是排列。
两个公式两性质,两种思想和方法。归纳出排列组合,应用问题须转化。
排列组合在一起,先选后排是常理。特殊元素和位置,首先注意多考虑。
不重不漏多思考,捆绑插空是技巧。排列组合恒等式,定义证明建模试。
关于二项式定理,中国杨辉三角形。两条性质两公式,函数赋值变换式。
令C(m,n)表示从m个数中选取n个数的组合个数
则有递推关系:C(m,n)=C(m-1,n-1)+C(m-1,n)
可采用二维数组dp[m][n]保存C(m,n)的结果,然后从小到大递推计算即可
但注意到m维的结果只和m-1维有关,因此可以用一维数组进行简化
令dp[n]表示当前为止,选出n个数的组合个数,注意外层遍历m次,内层要逆序遍历
最后由于n可能取到1000,结果会很大,一般取余表示防止溢出
C语言代码如下所示:
#include stdio.h
long long dp[1001]; // 结果可能很大,用长整型
// 但长整型最大也只能表示到C(66,33) = 7219428434016265740
// 因为输入n最大为1000,所以结果可取余表示
const int MOD = 1e9 + 7; // 10^9+7,用于结果取余表示
int main() {
int n;
scanf("%d", n);
int m = 2 * n;
dp[0] = 1; // 初始化,C(m,0)=1
for (int i = 0; i m; ++i) { // 外层遍历m次
for (int j = n; j = 1; --j) { // 内存要倒序遍历
//dp[j] = dp[j] + dp[j - 1]; // 若不取余,长整型最大只能表示到n=33
dp[j] = (dp[j] + dp[j - 1]) % MOD; // 取余显示,防止结果溢出
}
}
printf("C(%d,%d) = %lld\n", m, n, dp[n]);
return 0;
}
结果如图:
编译通过,示例如上,C(6,3)=20,结果正确,望采纳~
刚花了一个多小时帮你把这个写出来了,兄弟,不容易啊 ,多给点悬赏啊!
#include stdio.h
void main()
{
int m=1,i,n,j,t,k,q;
scanf("%d",n);
for(i=0;in;i++)
m=3*m; //m为3的n次方
k=m; //记忆m的值
for(i=0;im;i++)
{ q=i; //记忆i的值
for(j=0;jn;j++)
{
if(i=m) {i=i-m*t;j--;continue;}
m=m/3;
if(im) {printf("a");}
else if(i=mi2*m) {printf("b");t=1;}
else {printf("c");t=2;}
}
printf("\n");
m=k; //恢复m的值
i=q; //恢复i的值
}
}