c++ - c ++:int小于INT_MAX时溢出
问题描述
我写了如下代码。
#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;
int IntResult = 0;
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;
}
当我输入“141421 35623”时,此代码输出如下。
141421 35623
220280457
619089693
正确答案是“220280457”。int 的结果是错误的。
我将 cout 放入 for 循环并检查了 IntResult 的值。
然后我发现 IntResult 在 for 循环中变成了负值。溢出来了!
但为什么?int 的最大值是“2147483648”。它大于“220280457”。
而for循环中的过程只是一个加法,所以我不明白为什么会溢出。
请帮我!
解决方案
您在第一次迭代时溢出。
1 + (N + 1 - i) * i
小于
(N - i)*i
第一次迭代:
(141421-35623)*35623
哎呀已经溢出了,这是有符号整数中的 UB。
IntResult % (1000000000 + 7)
之后发生,并且没有任何意义,因为 IntResult 包含未知值。
推荐阅读
- git - 在单个存储库上工作的并发 git 进程
- c# - NLog 文件的自定义文件名
- bash - 使用 ssh 进入双跳机器
- c++ - C++ 控制台应用程序未在 macOS 上的 Xcode 9.3 中编译
- jquery - 引导选择器多个关闭按钮
- http-headers - WSO2 ESB 获取所有传输标头
- java - 当 SELECT 查询在插入查询之前时,getGeneratedKeys() 不起作用
- symfony - 在自定义 Symfony FormType 中设置约束
- amazon-s3 - 单个 lambda 函数可以执行多个任务吗?
- gnuplot - 从空 gnuplot 点的中心移除点