题意解释
找两个质数,他们相加等于给定的一个数,同时保证这两个数相差最大。(题意很好理解)这道题的重点在于时间限制,在判定质数的时候,不能用最简单的方法,应当使用质数筛选法。同时在打表之后,找另一个质数的时候最好使用二分法查找,结果可以AC。
收获
代码技巧
- lower_bound()这个在algorithm的头文件里,非常好用,是二分法查找。
- 在初始化的时候,最好用define来,我因为少打一个9查了一上午的错
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;
}