#include <iostream>
#include <unordered_set>
#include <vector>
using namespace std;
bool isPrime(int num) {
if (num <= 1) {
return false;
}
if (num == 2) {
return true;
}
if (num % 2 == 0) {
return false;
}
for (int i = 3; i * i <= num; i += 2) {
if (num % i == 0) {
return false;
}
}
return true;
}
int countPairs(int n) {
std::vector<int> primes;
std::unordered_set<int> primes_set;
for (int i = 2; i < n; i++) {
if (isPrime(i)) {
primes.push_back(i);
primes_set.insert(i);
}
}
int count = 0;
for (int a : primes) {
int b = n - a;
if (b < a) {
break;
}
if (primes_set.count(b)) {
count++;
}
}
return count;
}
int main() {
int n;
cin >> n;
std::cout << countPairs(n) << std::endl;
return 0;
}
// 64 位输出请用 printf("%lld")
解题思路
先找到小于n的所有素数,把这些素数分别存放在一个vector中和一个unordered_set中,然后遍历vector中的每个数。
由a代替,然后b代替n-a,查看b是否在unordered_set中,如果在,count++。
一旦发现b小于a时,就直接退出循环,避免重复计算。



京公网安备 11010502036488号