将输入的数分为奇数和偶数,只有奇数和偶数的和才有可能为素数,因此需要将奇数集合和偶数集合的数字组合在一起。遍历每一个奇数,为它寻找合适的偶数组成一对,使用find函数,如果合适的偶数已经组成了一对,则让它的奇数同伴寻找其他合适的偶数,如果最终此奇数可以找到偶数组成一对,则组合数加一,循环结束后输出组合对数。

#include <iostream>
#include <vector>
#include <set>
using namespace std;

bool find(int odd, const vector<int> & evens, vector<int> & evenMatch, vector<int> & used);

int main() {
    int n;
    cin >> n;
    vector<int> evens;
    vector<int> odds;
    int number;
    for (int i = 0; i < n; i++) {
        cin >> number;
        if (number % 2 == 0) {
            evens.push_back(number);
        } else {
            odds.push_back(number);
        }
    }
    vector<int> evenMatch(evens.size(), 0);
    int count = 0;
    for (int odd : odds) {
        vector<int> used(evens.size(), 0);
        if (find(odd, evens, evenMatch, used)) {
            count++;
        }
    }
    cout << count;
    return 0;
}

bool isPrimeNum(int n) {
    if (n == 2) {
        return true;
    }
    for (int i = 2; i < n; i++) {
        if (i * i > n) {
            return true;
        }
        if (n % i == 0) {
            return false;
        }
    }
    return true;
}

bool find(int odd, const vector<int> & evens, vector<int> & evenMatch, vector<int> & used) {
    for (int i = 0; i < evens.size(); i++) {
        if (isPrimeNum(odd + evens[i]) && used[i] == 0) {
            used[i] = 1;
            if (evenMatch[i] == 0 || find(evenMatch[i], evens, evenMatch, used)) {
                evenMatch[i] = odd;
                return true;
            }
        }
    }
    return false;
}
// 64 位输出请用 printf("%lld")