想太复杂了,先求10000以内的素数。再根据双指针来查找。
其实可以直接从中间枚举,然后判断两个数是否为素数。

  • 解1
#include <iostream>
using namespace std;


int np[10001];
int p[5000];
int pCnt = 0;

void a_prime( int num )
{

    for ( int i = 2; i <= num; ++i) {
        if (!np[i]) {
            p[pCnt++] = i;
            for ( int j = i * i; j <= num; j += i)
                np[j] = 1;
        }
    }
}
void e_prime( int num ) 
{
    for ( int i = 2;i <= num; ++i) {
        if (!np[i]) p[pCnt++] = i;

        for ( int j = 0; j < pCnt && i  <= num/p[j]; ++j) {
            np[i * p[j]] = 1;
            if ( i % p[j] == 0)
                break;
        }
    }

}


int primePos(int n) {
    for ( int i = 0;i < pCnt; ++i)
        if ( n == p[i])
            return i;
    return -1;
}

int main() {
    
    e_prime(1001);

    int n;
    cin >> n;
    int x = 0,y = 1000000;

        int i = 0;
        int j = pCnt - 1;

        
        while ( i <= j) {
            if ( p[i] + p[j] > n)
                j--;
            else if ( p[i] + p[j] < n)
                i++;
            else {
                if ( p[j] - p[i] < y - x )
                    y = p[j],x = p[i];
                i++;j--;
            }
        }
        cout << x << endl;
        cout << y << endl;  
    


    return 0;
}
  • 解2
#include <iostream>
using namespace std;

bool isPrime(int a) {
    if ( a == 1)
        return false;
    if ( a == 2)
        return true;

    for ( int i = 2; i <= a/i;++i)
        if ( a % i == 0)
            return false;
    return true;
}

int main() {
    

    int n;
    cin >> n;

    for ( int i = n / 2; i >= 2; --i) {
        if ( isPrime(i) && isPrime(n - i)) {
            cout << i  << endl;
            cout << n - i << endl;
            break;
        }
    }    


    return 0;
}
// 64 位输出请用 printf("%lld")