大输出的浮点异常

时间:2014-08-10 14:16:51

标签: c factorial divide-by-zero

请告诉我为什么我在这段代码中得到浮点异常?它适用于n = 1或2这样的小数,但如果我把n = 40或大于它的数字给它我的浮点异常。

 #include<stdio.h>
 int fact(unsigned long long int);
 int main()
 {
 int t;
 scanf("%d",&t);
 while(t--)
 {
 unsigned long long int n,k=0,i=0,sum=0;
 scanf("%llu",&n);
 for(i=1;i<=n;i++)
 {
 k=i;
 if(n==k)
 sum+=1;
 else
 sum+=fact(n)/(fact(k)*fact(n-k));
 }
 printf("%llu\n",sum%1000000007); 
 }
 return 0;
 }
 int fact(unsigned long long int n)
 {
 if(n==1)
 return 1;
 else
 return (n*fact(n-1));
 }

1 个答案:

答案 0 :(得分:0)

我看到你正在计算nC1 + nC2 + nC3 + ... nCn。为此,您可以使用以下结果:

nC0 + nC1 + nC2 + nC3 + ... nCn = 2 ^ n
nC1 + nC2 + nC3 + ... nCn = 2 ^ n - 1

以下是执行相同操作的代码

#include<stdio.h>
#define MOD 1000000007
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        unsigned long long int n, i = 0, sum = 1;
        scanf("%llu", &n);
        for(i = 1; i <= n; i++)
        {
            sum = sum << 1;
            sum = sum % MOD;
        }
        sum = sum - 1;      
        printf("%llu\n", sum % MOD); 
    }
    return 0;
}