C++ int类型溢出疑问:最终结果未超INT_MAX却中途溢出
中间计算溢出导致int结果错误的原因与修复
嘿,我来帮你理清楚这个问题——你遇到的是中间计算溢出的坑,不是最终结果超出int范围的问题!
你说得对,最终正确结果220280457确实小于int的最大值2147483647,但问题出在循环里的每一步计算过程,而不是最终的总和。
咱们拆解循环里的核心计算式:1 + (N + 1 - i) * i
当输入N=141421、K=35623时,循环中i会从35623遍历到141422。取一个中间值,比如i≈70711(接近(N+1)/2),此时(N+1 -i)*i的结果是:(141422 - 70711)*70711 = 70711 * 70711 = 5,000,045,521
这个数值远远超过了int的最大值2,147,483,647,所以在计算这个乘积的时候,int类型直接溢出,变成了错误的负数或乱码值,之后再把这个错误值累加进IntResult,自然就会得到完全错误的最终输出。
修复方案
有两个简单的解决办法:
方案一:直接把IntResult改成long long类型
这是最稳妥的方式,因为long long的范围足够容纳中间计算的所有值,避免溢出:
// 把原来的int IntResult = 0;改成: long long IntResult = 0;
方案二:计算时强制转换类型(不推荐,仅作参考)
如果一定要保留int类型的IntResult,可以在计算时先把其中一个操作数转成long long,确保乘积在long long范围内计算,再转成int累加:
IntResult += static_cast<int>(1LL + (N + 1 - i) * static_cast<long long>(i));
修改后的完整代码(方案一):
#include <iostream> #include <string> #include <stack> #include <cctype> #include <algorithm> #include <vector> using namespace std; long long int N, K; int main() { cin >> N >> K; long long int result = 0; long long IntResult = 0; // 修改为long long类型 for (long long int i = K; i <= N + 1; i++) { result += 1 + (N + 1 - i) * i; IntResult += 1 + (N + 1 - i) * i; } cout << result % (1000000000 + 7) << endl; cout << IntResult % (1000000000 + 7) << endl; return 0; }
这样修改后,中间计算不会再溢出,IntResult就能输出正确结果了。
内容的提问来源于stack exchange,提问作者Dumble009
相关产品推荐
相关产品推荐

