想太复杂了,先求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")