如何修复MINGW编译运行C++ Codeforces题时结果与在线IDE不一致的bug
问题根因
你遇到的不是MinGW的bug,是代码本身存在数组越界访问的未定义行为,不同运行环境下内存布局不同,才会出现结果不一致的情况。
你的数组arr长度为4,合法下标范围是0~3,但第二层循环i从0到3时,会访问arr[i+1]、arr[i+2]、arr[i+3]:
- 当i=1时,
i+3=4已经超出合法下标 - 当i=2时,
i+2=4、i+3=5超出范围 - 当i=3时,
i+1=4、i+2=5、i+3=6全部越界
越界访问的内存值是不确定的,ideone运行时刚好越界读到的值不会触发错误的计数逻辑,MinGW运行时读到的值刚好匹配了判断条件,才会得到错误结果。
修复方案
方案1:修改原有逻辑的循环范围
你的原有逻辑是统计「存在后续重复值的元素个数」,只需要把第二层循环的终止条件改成i < 3,避免i=3时的越界访问即可:
using namespace std; int main() { ios_base::sync_with_stdio(0); cin.tie(NULL); int arr[4]; int ans = 0; for (int i = 0; i < 4; ++i) { cin >> arr[i]; } // 只遍历前3个元素,判断后面有没有重复 for (int i = 0; i < 3; ++i) { if (arr[i] == arr[i + 1] || arr[i] == arr[i + 2] || arr[i] == arr[i + 3]) { ans++; } } cout << ans; }
方案2:用更稳妥的去重统计逻辑
可以用set自动去重的特性直接计算结果,完全避免越界问题,逻辑更清晰:
#include <iostream> #include <set> using namespace std; int main() { ios_base::sync_with_stdio(0); cin.tie(NULL); set<int> s; for (int i = 0; i < 4; ++i) { int x; cin >> x; s.insert(x); } cout << 4 - s.size(); return 0; }
内容的提问来源于stack exchange,提问作者Soumyajoy Das
相关产品推荐
相关产品推荐

