【模板题】 哥德巴赫猜想
传送门
题意
哥德巴赫猜想是任意一个大于 \(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();
}

浙公网安备 33010602011771号