C语言程序设计:c=m!/(n!*(m-n)!)

 我来答
爱教育爱学习
高粉答主

2019-10-22 · 学而不思则罔,思而不学则殆
爱教育爱学习
采纳数:384 获赞数:112736

向TA提问 私信TA
展开全部

C(n,m)=n!/(m!*(n-m)!),C(n,m)=p1a1-b1-c1p2a2-b2-c2…pkak-bk-ck,n<=10,000,000

[cpp]

#include<cstdio>

constintmaxn=1000000;

#include<vector>

usingnamespacestd;

boolarr[maxn+1]={false};

vector<int>produce_prim_number()

{

vector<int>prim;

prim.push_back(2);

inti,j;

for(i=3;i*i<=maxn;i+=2)

{

if(!arr[i])

{

prim.push_back(i);

for(j=i*i;j<=maxn;j+=i)

arr[j]=true;

}

}

while(i<maxn)

{

if(!arr[i])

prim.push_back(i);

i+=2;

}

returnprim;

}

//计算n!中素数因子p的指数

intcal(intx,intp)

{

intans=0;

longlongrec=p;

while(x>=rec)

{

ans+=x/rec;

rec*=p;

}

returnans;

}

//计算n的k次方对m取模,二分法

intpow(longlongn,intk,intM)

{

longlongans=1;

while(k)

{

if(k&1)

{

ans=(ans*n)%M;

}

n=(n*n)%M;

k>>=1;

}

returnans;

}

//计算C(n,m)

intcombination(intn,intm)

{

constintM=10007;

vector<int>prim=produce_prim_number();

longlongans=1;

intnum;

for(inti=0;i<prim.size()&&prim[i]<=n;++i)

{

num=cal(n,prim[i])-cal(m,prim[i])-cal(n-m,prim[i]);

ans=(ans*pow(prim[i],num,M))%M;

}

returnans;

}

intmain()

{

intm,n;

while(~scanf("%d%d",&m,&n),m&&n)

{

printf("%d\n",combination(m,n));

}

return0;

}

扩展资料

C语言N项规律数和

#include"stdio.h"

#include"stdlib.h"

main()

{

intk=1,m=2;

intn,i,j;

scanf("%4d",&n);

j=1;

printf("%4d",k);

for(i=1;i<n;i++)

{

if(k==m)

{

j=-1;

m=m+1;

}

elseif(k==1)

{

j=1;

k=k+j;

printf("%4d",k);

}

printf("\n");

}

}

一生何求725
推荐于2017-10-15 · TA获得超过2952个赞
知道大有可为答主
回答量:2663
采纳率:84%
帮助的人:559万
展开全部

1、此题先构造一个求阶乘的函数,然后3次调用该函数,即可。

2、程序的源代码如下:

#include<stdio.h>


int fact(int n);

int main()

{

int m,n,c;


printf("请输入m的值:\n");

scanf("%d",&m);

printf("请输入n的值(n<=m):\n");

scanf("%d",&n);

    

c=fact(m)/(fact(n)*fact(m-n));


printf("请输出c的值:\n");

printf("%d\n",c);


 return 0;

}


int fact(int n)//用递归求n的阶乘

{

    if(n == 0 || n == 1)

return 1;

    return 

n*(fact(n-1));

}

3、运行结果如下,至于程序的漏洞可以自己完善以提高程序的容错能力。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
好朋友_shuang
2010-05-04 · TA获得超过374个赞
知道小有建树答主
回答量:261
采纳率:100%
帮助的人:194万
展开全部
#include"stdio.h"
int f(int n)
{
int i,s=1;
for(i=2;i<=n;i++)
s*=i;
return s;
}
int main()
{ int m,n;
while(scanf("%d%d",&m,&n))
{
printf("%d\n",f(m)/(f(n)*f(m-n)));
}
return 0;
}
//祝你学习进步
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
AmiyaVenus
推荐于2017-10-05 · TA获得超过4296个赞
知道大有可为答主
回答量:2845
采纳率:100%
帮助的人:2482万
展开全部
#include<stdio.h>
int jiecheng(int x)
{
if(x==1)return 1;
else return x*jiecheng(x-1);

}
void main()
{
int m,n,c;
scanf("%d%d",&m,&n);
c=jiecheng(m)/(jiecheng(n)*jiecheng(m-n));
printf("c=%d",c);
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式