zhangwch • 18天前
#include <iostream>
using namespace std;
const int N = 500005;
// p[]数组存储所有的质数, vis数组表示有没有“划掉”过
int a, b, siz, p[N];
bool vis[N];
int main() {
cin >> a >> b;
for (int i = 2; i <= b; i++) {
if (!vis[i]) p[siz++] = i;
for (int j = 0; p[j] <= b / i; j++) {
vis[p[j] * i] = 1;
if (i % p[j] == 0) break;
}
}
// for (int i = 0; i < siz; i++) cout << p[i] << endl;
if (a % 2 == 1) a++;
for (int i = a; i <= b; i += 2) {
// 直接遍历质数数组,也就是p数组
for (int j = 0; p[j] <= i / 2; j++) {
// 如果i减去质数剩下的另一半没有被划掉过,那就也是质数
if (!vis[i - p[j]]) {
cout << i << "=" << p[j] << "+" << i - p[j] << endl;
break;
}
}
}
return 0;
}
但是经过测试,5e5以内的所有偶数,最多遍历到389,就能拆成两个素数的和,所以用常规的筛法不会超时。
评论: