【发布时间】:2022-01-11 17:26:26
【问题描述】:
我正在从 Codeforces 解决这个问题。 Link
我使用 Sublime Text 3 作为我的代码编辑器和 Mingw 作为我的编译器。当我使用我的 Mingw 编译和运行代码时,它给出了错误的答案,而当我使用 https://ideone.com/ 时,我的答案不同并且是正确的。
我的代码
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];
}
for (int i = 0; i < 4; ++i)
{
if (arr[i] == arr[i + 1] || arr[i] == arr[i + 2] || arr[i] == arr[i + 3]) {
ans++;
}
}
cout << ans;
}
Test-Case:1
INPUT:
4 4 4 4
MINGW OUTPUT:
4
IDEONE OUTPUT:
3
Test-Case:2
INPUT:
1 7 3 3
MINGW OUTPUT:
2
IDEONE OUTPUT:
1
【问题讨论】:
-
您在
for循环中有越界访问。将此:int a[4];更改为:std::array<int, 4> a;,然后将此:if (arr[i] == arr[i + 1] || arr[i] == arr[i + 2] || arr[i] == arr[i + 3])更改为:if (arr.at(i) == arr.at(i + 1) || arr.at(i) == arr.at(i + 2) || arr.at(i) == arr.at(i + 3))。然后,无论您使用什么编译器,您都会看到问题。 -
当
i == 3时,你认为arr[i + 1]应该是什么? -
@PaulMcKenzie 当我用你的代码替换我的代码时,我收到了这个错误。
terminate called after throwing an instance of 'std::out_of_range' what(): array::at: __n (which is 4) >= _Nm (which is 4) -
@SoumyajoyDas - 这个错误是意料之中的,我们已经指出了问题所在。
at()函数会自动检查数组边界,而使用哑数组的原始代码不会。 -
@SoumyajoyDas 但我没有得到任何输出 -- 你的代码停止了,因为你越界了,这就是
at()调用所做的。不需要其他更改——您需要修复代码中的逻辑,以免越界。它与是否使用矢量绝对无关。再看一下前两个 cmets——你的代码逻辑完全错误。
标签: c++ arrays algorithm for-loop undefined-behavior