You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 10:57:51