今天做的这道题,让我发现,我还是对乘法的溢出不够敏感。。。。找这个错误找了很久也没发现。。。
题目:计算组合数
demo:
#include <stdio.h>
long long factorial(int n)
{
int i;
long long m = 1;
for(i = 1; i <= n; i++)
{
m *= i;
}
printf("%ld\n",m);
return m;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,m;
int i;
//long long sum = 0;
scanf("%d%d",&n,&m);
//sum = factorial(n)/(factorial(m) * factorial(n - m));
if(m < n - m)
{
m = n - m;
}
long long ans = 1;
for(i = m+1; i <= n; i++)
{
ans *= i;
}
for(i = 1; i <= n - m; i++)
{
ans /= i;
}
printf("%ld\n",ans);
}
return 0;
}
刚开始,直接用公式计算,怎么着算出来结果都不对,后来看书才知道,原来乘法又溢出了。。。
应该将公式变换,
避免阶乘!避免阶乘!避免阶乘!希望下次敏感点。。。