【问题标题】:floating point exception for big output大输出的浮点异常
【发布时间】:2014-08-10 14:16:50
【问题描述】:

请告诉我为什么我在这段代码中出现浮点异常?它适用于像 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));
 }

【问题讨论】:

  • 浮点异常?真的吗?您的程序中没有任何浮点计算!
  • @TonyK 浮点异常意味着“整数除以零”,有时是INT_MIN / (-1)。您必须竭尽全力在浮点计算中引发浮点异常(例如,默认情况下 1.0 / 0.0 计算结果为 +inf 没有异常)。
  • @PascalCuoq:我不明白你的评论。如果我尝试执行整数除以零,我会得到整数除零异常 (0xC0000094),而不是浮点异常。
  • @TonyK 您的系统可能会将整数除以 0 标记为“整数除零异常”。即使使用整数代码,其他系统也会将其标记为“浮点除零异常”。

标签: c factorial divide-by-zero


【解决方案1】:

我看到您正在计算 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多