计算组合数
#include<stdio.h>
long long factorial(int n)
{
long long m = 1;
int i;
for ( i = 0; i < n; i++)
m *= i;
return m;
}
long long C (int n,int m)
{
return factorial(n) / (factorial(m) * factorial(n - m));
}
int main()
{
int n , m;
scanf("%d%d",&n,&m);
printf("%d", C(n,m));
return 0;
}
此处当n=21,m=1,会出现错误结果,中间结果出现溢出。
因此,可以对原式子进行化简,避免出现一些过大的中间结果。
long long C(int n, int m)
{
if (m < n - m) m = n - m;
long long ans = 1;
int i;
for (i = m + 1; i <= n; i++)
ans *= i;
for (i = 1; i <= n - m; i++)
ans /= i;
return ans;
}