2018-5-23
验证哥德巴赫猜想,直接将素数全部筛出来,然后从小到大枚举即可,找到的第一个满足条件的肯定就是差值最大的即满足题意的。
普通筛素数:
#include<iostream>
#include<cstring>
using namespace std;
const int N = 1000000;
bool isprime[N+1];
int prime[N+1];
void init(){
memset(isprime,true,sizeof(isprime));
int cnt=0;
isprime[2]=true;
for (int i=2;i<=N;i++){
if (!isprime[i]) continue;
prime[cnt++]=i;
for (int j=i*2;j<=N;j+=i){
isprime[j]=false;
}
}
}
int main(){
int n;
init();
while (cin>>n){
if (n==0) break;
bool flag=false;
for (int i=3;i<=n/2+1;i++){
if (isprime[i]&&isprime[n-i]){
flag=true;
cout<<n<<" = "<<i<<" + "<<n-i<<endl;
break;
}
}
if (!flag) cout<<"Goldbach's conjecture is wrong."<<endl;
}
}
线性筛素数:
#include<iostream>
#include<cstring>
using namespace std;
const int N = 1000000;
bool isprime[N+1];
int prime[N+1];
void init(){
memset(isprime,true,sizeof(isprime));
int cnt=0;
isprime[2]=true;
for (int i=2;i<=N;i++){
if (isprime[i]) prime[cnt++]=i;
for (int j=0;j<cnt&&i*prime[j]<=N;j++){
isprime[i*prime[j]]=false;
if (i%prime[j]==0) break;
}
}
}
int main(){
int n;
init();
while (cin>>n){
if (n==0) break;
bool flag=false;
for (int i=3;i<=n/2+1;i++){
if (isprime[i]&&isprime[n-i]){
flag=true;
cout<<n<<" = "<<i<<" + "<<n-i<<endl;
break;
}
}
if (!flag) cout<<"Goldbach's conjecture is wrong."<<endl;
}
}