我不认为我的代码中有任何要达到零或将其除以零所以任何人都可以帮助我为什么我得到输入 20 75 的浮点异常
我只是计算 2*n -1 的阶乘并将它与 n 和 n-1 的阶乘相乘,但我不知道我的代码在哪里变零或其他原因
int fact(int num) {
if(num == 1 || num == 0) return 1;
else return (num*fact(num-1));
}
int Solution::solve(int A) {
int val1 = fact(A-1);
int val2 = fact(A-1+A-1);
int ans = (val2/((val1*val1)%1000000007))%1000000007;
return (ans/A)%1000000007;
}
对于 A = 20 或 A = 75 我得到浮点异常
最佳答案
输入 A = 20 时,您调用 fact(20 - 1)
和 fact(20 - 1 + 20 - 1)
,它们是 fact(19 )
事实(38)
。 19 的阶乘是 121645100408832000,38 的阶乘是 523022617466601111760007224100074291200000000。
在典型的 PC 上,int
的最大可表示值是 2147483647,它小于您尝试计算的上述任何一个阶乘。您的程序溢出了一个带符号的整数,并且程序的行为未定义。
对于I don't think there is any point in my code I am ... dividing it with zero
val1
的某些值,(val1*val1)%1000000007
可能为零。因此 val2/((val1*val1)%1000000007)
可能被零除。一个简单的情况是 val1
为零,另一个情况是 1000000007。您可能认为 val1
永远不可能是这两个值中的任何一个,因为它们不是阶乘,但当您在程序中签名溢出时,它们完全可以是任何一个值。
用 32 位整数表示的最大阶乘是 12!因此,您的函数可以解决的最大输入是 A = 7。
关于c++ - 为什么我得到浮点异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58150914/