按理来说要用线性筛的

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,就能拆成两个素数的和,所以用常规的筛法不会超时。


评论: