分析:按照书上说明,直接求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;
}
结果: