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