題意解釋
找兩個(gè)質(zhì)數(shù),他們相加等于給定的一個(gè)數(shù),同時(shí)保證這兩個(gè)數(shù)相差最大。(題意很好理解)這道題的重點(diǎn)在于時(shí)間限制,在判定質(zhì)數(shù)的時(shí)候,不能用最簡單的方法,應(yīng)當(dāng)使用質(zhì)數(shù)篩選法。同時(shí)在打表之后,找另一個(gè)質(zhì)數(shù)的時(shí)候最好使用二分法查找,結(jié)果可以AC。
收獲
代碼技巧
- lower_bound()這個(gè)在algorithm的頭文件里,非常好用,是二分法查找。
- 在初始化的時(shí)候,最好用define來,我因?yàn)樯俅蛞粋€(gè)9查了一上午的錯(cuò)
AC代碼
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
#define MAXN 1000010
#define ll long long
int Prime[MAXN];
bool NotPrime[MAXN];
int prime_total;
void generate_prime(int n){
//prime_total = 0;
for(ll i = 2; i <= n; i++){
if(!NotPrime[i]){
Prime[prime_total++] = i;
for(ll j = i*i; j <=n; j+=i){
NotPrime[j]=true;
}
}
}
}
void solve(int number){
for(int i = 0; i < prime_total;i++){
int a = Prime[i];
int b = *lower_bound(Prime,Prime+prime_total,number-a);
if(a+b==number){
cout << number << " = " << a << " + " << b << endl;
break;
}
}
return ;
}
int main()
{
int num;
generate_prime(999999);
cin >> num;
while(num != 0){
solve(num);
cin >> num;
}
return 0;
}