#include <cstdio>
#include <cmath>
#include <cstring>
#define MAXN 1000
int goc(int m,int n)
{
if(m<n)
{
m=m^n;
n=m^n;
m=m^n;
}
while(m%n)
{
int c=m%n;
m=n;
n=c;
}
return n;
}
void IntToChar(int n,char *s)
{
int a[MAXN];
int i=0;
while(n)
{
a[i++]=n%10;
n/=10;
}
int j;
for(j=0;j<i;j++)
s[j]=a[i-1-j]+'0';
s[j]=0;
}
void multiply(char *a,int n) //模板
{
char b[MAXN];
IntToChar(n,b);
int len1=strlen(a);
int len2=strlen(b);
int len=len1+len2;
int t1[MAXN],t2[MAXN],t[MAXN];
int i,j;
for(i=0;i<len1;i++)
t1[i]=a[len1-i-1]-'0';
for(i=0;i<len2;i++)
t2[i]=b[len2-i-1]-'0';
for(i=0;i<len;i++)
t[i]=0;
for(i=0;i<len1;i++)
for(j=0;j<len2;j++)
t[i+j]+=t1[i]*t2[j];
for(i=0;i<len-1;i++)
{
t[i+1]+=t[i]/10;
t[i]%=10;
}
while(!t[len-1])
len--;
for(i=0;i<len;i++)
a[i]=t[len-i-1]+'0';
a[i]=0;
}
void combination(int m,int n)//求C(m,n)
{
int i,j;
int *a,*b;
a=new int[n];
b=new int[n];
for(i=0;i<n;i++)
{
a[i]=i+1;
b[i]=m-i;
}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(b[i]==1)
break;
int c=goc(b[i],a[j]);
b[i]/=c;
a[j]/=c;
}
char ans[MAXN]="1";
for(i=0;i<n;i++)
multiply(ans,b[i]);
puts(ans);
delete a;
delete b;
}
使用时直接调用
combination(m,n)