您的位置:首页 > 其它

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

2013-10-14 14:19 309 查看
算法题:给你一个自然数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){

}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万需要遍历。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐