c++ - 为什么我得到浮点异常
问题描述
我认为我的代码中没有任何一点我达到零或将其除以零所以任何人都可以帮助我为什么我得到输入 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)
fact(38)
. 19 的阶乘是 121645100408832000,38 的阶乘是 523022617466601111760007224100074291200000000。
在典型的 PC 上,最大可表示值为int
2147483647,它小于您尝试计算的上述任何一个阶乘。您的程序溢出有符号整数,并且程序的行为未定义。
我认为我的代码没有任何意义...将其除以零
(val1*val1)%1000000007
对于 的某些值可能为零val1
。因此val2/((val1*val1)%1000000007)
可能被零除。一个简单的情况是什么时候val1
为零,另一种情况是 1000000007。您可能会认为这val1
永远不可能是这些值中的任何一个,因为它们不是阶乘,但是当您签名时它完全可以是任何一个值在你的程序中溢出。
可以用 32 位整数表示的最大阶乘是 12!因此,您的函数可以解决的最大输入是 A = 7。
推荐阅读
- r - 删除一个特定列的缺失值?
- svg - 围绕中心的SVG旋转是移动对象
- ruby-on-rails - Rails 会话存储与 ActiveRecord 对象中的缓存
- excel - 在 Excel 中如何复制列标题
- awk - 在 gsub 的字符串替换部分使用 awk 变量
- spring-boot - spring boot rest API 被阻塞
- twilio - Twillio - Findme Twimlet
- powerbi - 自动从 Power BI 导出到 Power Point
- ffmpeg - 任何人都知道如何更改 FFMPEG 命令以输出一半大小?
- c# - 使用证书和用户名/密码访问网站到 webscrape