求前n个数乘积遇大n结果错误,疑溢出如何解决?
解决前n个数乘积取模的整数溢出问题
你的判断完全正确,就是整数溢出导致的错误。long类型的存储范围有限(64位long最大值约为9×10¹⁸),当n超过20时,n!的结果就会超出这个范围,溢出后变量ans会变成错误的数值,最后取模自然得不到正确结果。
解决方法很直接,利用模运算的分配律,在每一次乘法操作后立即对结果取模,这样能始终把ans的数值控制在1000000007以内,彻底避免溢出。修改后的代码如下:
long ans = 1; final int MOD = 1000000007; for (int i = 1; i <= n; i++) { ans = (ans * i) % MOD; } return ans;
核心说明
- 模运算的基本性质:
(a * b) % mod = [(a % mod) * (b % mod)] % mod,每一步取模不会改变最终结果的正确性。 - 把
1000000007定义为常量MOD,既能提升代码可读性,也能避免重复输入出错。 - 哪怕n取值非常大(比如1e5甚至更大),这种写法都能稳定运行,不会再出现溢出问题。
内容的提问来源于stack exchange,提问作者Sahil
相关产品推荐
相关产品推荐

