POJ2262

题目LINK

题意解释

找两个质数,他们相加等于给定的一个数,同时保证这两个数相差最大。(题意很好理解)这道题的重点在于时间限制,在判定质数的时候,不能用最简单的方法,应当使用质数筛选法。同时在打表之后,找另一个质数的时候最好使用二分法查找,结果可以AC。

收获

代码技巧
  1. lower_bound()这个在algorithm的头文件里,非常好用,是二分法查找。
  2. 在初始化的时候,最好用define来,我因为少打一个9查了一上午的错

AC代码

#include 
#include 
#include 

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;
}

你可能感兴趣的:(POJ2262)