您的位置:首页 > 其它

例题4-1 输入非负整数n和m,输出组合数,其中m<=n<=20

2014-07-28 19:02 288 查看
分析:按照书上说明,直接求20!会溢出。可以先将n!与m!和(n-m)!的较大者进行约分。在尝试一种简单的策略:看分子中的每一个数是否被分母可约。

代码:

#include <stdio.h>

#define MAXN 20

int main(){
int a[MAXN],b[MAXN],resA=1,resB=1;
int m,n,s,i,j,k,l,tmp;
while((scanf("%d%d",&n,&m))!=EOF){
resA=resB=1;
s=m>(n-m)?m:n-m;
for(i=0;i+s<n;i++) a[i]=s+i+1;
for(j=1;j<=n-s;j++) b[j]=j;
for(k=1;k<j;k++){
tmp=b[k];
for(l=0;l<i;l++)
if(!(a[l]%tmp)){
a[l]/=tmp;
b[k]=1;
break;
}
}
for(l=0;l<i;l++) resA*=a[l];
for(k=1;k<j;k++) resB*=b[k];
printf("%d\n",resA/resB);
}
return 0;
}


结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐