【模板题】 哥德巴赫猜想

传送门

题意

哥德巴赫猜想是任意一个大于 \(4\) 的偶数可以拆成两个奇质数的和,多组输入,给定一个 \(n\),求是否有一组奇质数满足上述,当有多组的时候求差值最大的一组

数据范围

\(6 \leq n \leq 10^{6}\)

题解

预处理所有的质数,在所有的质数中除了 \(2\) 以外全是奇数,特判即可确定一个素数,通过 \(n-p\) 判定是否为素数即可
素数从小到大枚举保证了差值最大

Code

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i=a;i<n;i++)
#define per(i,a,n) for(int i=n-1;i>=a;i--)

const int N=1e6+10;

int primes[N],cnt;
int n;
bool st[N];
void get_primes(int x){
    rep(i,2,x+1){
        if(!st[i]) primes[++cnt]=i;
        for(int j=1;primes[j] <= x/i;j++){
            st[primes[j]*i]=1;
            if(i%primes[j]==0) break;
        }
    }
}
void solve(){
    rep(i,2,cnt+1){
        int p=primes[i];
        if(!st[n-p]){
            cout<<n<<" = "<<p<<" + "<<n-p<<endl;
            return;
        }
    }
    cout<<"Goldbach's conjecture is wrong."<<endl;
}
int main(){
    get_primes(N);
    while(cin>>n && n) solve();
}
posted @ 2020-10-23 16:52  Hyx'  阅读(27)  评论(0)    收藏  举报