#2 RE 也就是输入10000 RE不知道为什么

P1304 哥德巴赫猜想

AC代码 ``` #include <bits/stdc++.h> using namespace std; int a[1000050]; int main() { int index = 0; a[index++] = 2; for (int i = 3; i <= 1000000; i += 2) { int flag = 1; for (int j = 2; j * j <= i; j++) { if (i % j == 0) { flag = 0; break; } } if (flag == 1) a[index++] = i; }//把1-10000的素数弄到一个表里 int n; cin >> n; for (int i = 4; i <= n; i += 2) { for (int j = 0; a[j] < i; j++) { int flag2 = 0; for (int k = 0; a[k] < i; k++) { if (a[k] + a[j] == i) { printf("%d=%d+%d\n", i, a[j], a[k]); flag2 = 1; break; } } if (flag2 == 1) break; } } return 0; } ``` 思路都没问题呀,就是数组开小了,以后遇到RE,要么是数组开小了,要么是数组访问越界,要么是int或bool函数无返回值,常见的就这些了,以后有问题可以私我,看见就回啦
by kmlihaiming @ 2023-12-14 13:30:28


@[spindrift](/user/1163793) ```cpp assert(k<index); ``` 结果: ~~~ Assertion failed: k<index ~~~ 原因 :`a` 前一部分是质数,后面都是零,如果用 `a[k]<i` 来判断是否停机,那么在 `a[k]` 未越界时 `a[k]<i` 总是成立的,停机条件是越界到程序不可读取的内存后 RE 或者是读取到可以访问且大于 `i` 的额外的内存上(这时可能是 WA)。 处理方法就是要么加上 `k<index` 的限制(`j<index`也得写上),要么让 `a[index]` 是一个大于 `10000` 的值,要么让质数表扩充一下,要么直接塞一个足够大的数。
by Terrible @ 2023-12-14 13:44:16


```cpp int _[2],a[10050],__[2]; int main() { memset(_,0x3f,8); memset(__,0x3f,8); ``` 前面改成这样也能过,原理是两边数组存上一个足够大的值,使得访问 `a` 越界后总是能停机。当然得保证两边数组不会被编译器优化掉。 [无O2](https://www.luogu.com.cn/record/139536424) [O2](https://www.luogu.com.cn/record/139536219)
by Terrible @ 2023-12-14 13:57:27


@[Terrible](/user/195942) @[Terrible](/user/195942) 噢,原来是这个原因啊,我说呢,谢谢大佬
by spindrift @ 2023-12-14 14:15:15


@[kmlihaiming](/user/920265) 谢谢了!
by spindrift @ 2023-12-14 14:15:52


@[spindrift](/user/1163793) 没有没有,就随便看一眼
by kmlihaiming @ 2023-12-15 19:24:59


|