我想知道在计算阶乘F时是否可以预测下一次迭代是否会产生整数溢出?
假设在每次迭代时我都有一个int I,最大值是MAX_INT。
这听起来像是家庭作业,我知道。不是。只是我问自己“愚蠢”的问题。
附录
我考虑到,给定多个BITS(整数可以采用的宽度,以位为单位),我可以将数字I向下舍入到下一个2的幂,并检测向左移位是否会超过BITS。但是算法怎么样呢?
答案 0 :(得分:9)
替代提示:
a * b ≤ MAX_INT
相当于
a ≤ MAX_INT / b
如果b> 0
答案 1 :(得分:4)
因子是一系列乘法,保持乘法结果所需的比特数是两个被乘数的比特之和。因此,保持运行总计中结果中使用了多少位,以及保持正在乘以的值所需的当前位数。当它大于剩余的位数时,您将要溢出。 / p>
答案 2 :(得分:2)
如果你到目前为止得到m = (n-1)!
并且你将要乘以n
,你可以通过检查
m <= MAX_INT / n
答案 3 :(得分:1)
您可以使用Stirling's Approximation formula来表示
ln(n!)= n * ln(n) - n + ln(2 * pi * n)/ 2 + O(1 / n)
并且非常准确。
你实际上并不需要尝试繁殖等等。当然,这并不能直接回答你的问题,但鉴于你只是好奇,希望这会有所帮助。