我认为代码中没有任何点达到零或将其除以零,所以任何人都可以帮助我为什么我得到输入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,我正在获得浮点异常
答案 0 :(得分:1)
在输入A = 20的情况下,调用fact(20 - 1)
fact(20 - 1 + 20 - 1)
的{{1}}和fact(19)
。 19的阶乘是121645100408832000,38的阶乘是523022617466601111760007224100074291200000000。
在典型的PC上,fact(38)
的最大可表示值是2147483647,该值小于您尝试计算的上述因子之一。您的程序溢出了一个有符号整数,并且该程序的行为未定义。
对于某些我认为我的代码中没有任何意义……将其除以零
int
值, (val1*val1)%1000000007
可以为零。因此val1
可能被零除。一种简单的情况是val2/((val1*val1)%1000000007)
为零,另一种情况为1000000007。您可能会认为val1
永远不是这些值之一,因为它们不是阶乘,而是当您在程序中签名溢出时,它完全可以是值。
用32位整数表示的最大阶乘是12!因此您的函数可以解决的最大输入为A = 7。
答案 1 :(得分:0)
我不能添加太多,但是如果您将所有int var = ...
变量更改为
long long int var = ...
(虽然我认为根据Google的风格指南不建议使用long long int
),但由于{
先前的评论:
20