c - 为什么这个程序给我一个 SIGFPE?

标签 c

我在下面的程序中收到 SIGFPE 错误,并且无法想出删除它的方法。

#include <stdio.h>

unsigned int fact(unsigned long int n)
{
    if (n <= 0)
        return 1;
    return n*fact(n-1);
}


int main(){
    int t,r,x,y,z,sum=0,n;

    scanf("%d",&t);

    for(int l=0; l<t; l++){

        scanf("%d",&n );

        if(n%2==0){
            for(int j=n,i=0,k=n; k>=0&&j>0;i++, j++,k-=2){
                x=fact(n-i);
                y=fact(k);
                z=fact(n-k-i);
                sum=sum+  (x)/(y*z);
            }
            printf("%d\n",sum );
        }

        if(n%2!=0){
            for(int j=n,i=0,k=n; k>=1&&j>0;i++, j++,k-=2){
                x=fact(n-i);
                y=fact(k);
                z=fact(n-k-i);
                sum=sum+  (x)/(y*z);

            }
            printf("%d\n",sum);
        }
        sum=0;

    }
    return 0;
}

我正在尝试计算需要阶乘的序列,但这给了我 SIGFPE 错误。我使用 35 作为输入。

问题链接:screen shot

solution

最佳答案

35!到目前为止,超出了您平台上 unsigned int 的容量。

然后发生的事情是 fact(35) 返回 0,这会导致除以 0,因此 SIGFPE(f位于 pe异常(exception))。

考虑使用unsigned long long类型,但这对于35也没有帮助,因为35!真的很大。

关于c - 为什么这个程序给我一个 SIGFPE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52875782/

相关文章:

c - 在 C 中验证整数

c - 在 C 可执行文件中动态包含文本

c - 如何将目录永久添加到 GCC 包含搜索路径?

c - 实现域名系统

c - C++ 链表中的成对交换

将一个指针内容复制到另一个

c - 无符号字符的 v8 Node 缓冲区

c - 如何确定堆栈上的返回地址?

c++ - 如何将 "jni/*.c/cpp"文件添加到 CMakeLists.txt 文件?

c - OSX + homebrew + CMake + libpng 版本不匹配问题