算法题:给你一个自然数N,求[6,N]之内的所有素数中,两两之和为偶数的那些偶数。

算法题:给你一个自然数N,求[6,N]之内的所有素数中,两两之和为偶数的那些偶数。

对于给定的N,我们可以用筛法求素素数的方法在O(n)的时间复杂度内求出所有的素数。

然后如何求给定的[6,N]内的数字内的偶数是由两个素数[6,N]组成的呢。

记得数学上有这样一个猜想:哥德巴赫猜想

任一大于2的偶数,都可表示成两个素数之和

所以6到N内的所有偶数都是由两个奇素数相加得到的(素数只有一个是偶数(废话= =))

所以只要对于每一个偶数,看它的两个奇素数是不是都在6,N里面就行了。

具体的对于一个偶数k,如果他可以由两个奇素数组成,且这两个奇素数没有一个是3或者5,那么这个偶数就是我们要找的偶数了

如果包含3或者5,那么只能通过不断枚举6,N内的素数进行判断了。


#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN = 1000001;
bool isprime[MAXN];
int num_p;
int prime[MAXN];
bool p[MAXN];
void makeprime(){
memset(isprime,false,sizeof(isprime));
num_p = 0;
for(int i = 2;i<MAXN;i++){
if(!isprime[i]){
prime[num_p++] = i;
isprime[i] = true;
}
for(int j = 0;j<num_p && i*prime[j]<MAXN;j++){
isprime[i*prime[j]] = true;
if(i%prime[j]==0)break;
}
}
memset(p,0,sizeof(p));
for(int i = 0;i<num_p;i++)p[prime[i]] = 1;
}
int main(){
makeprime();
int c = 0;
for(int i = 6;i<MAXN;i+=2){
if(p[i-3]!=1 && p[i-5]!=1){
c++;//更改了
}else {
for(int j = 3;prime[j]<=i/2;j++)if(p[prime[j]] && p[i-prime[j]]){
c++;
break;
}
}
}
cout <<c<<endl;
getchar();
getchar();
getchar();
getchar();
return 0;
}

发现1000000左右大概有14万需要遍历。。

猜你喜欢

转载自blog.csdn.net/sysucph/article/details/12708171