【发布时间】: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