算法题:给你一个自然数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){}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万需要遍历。。

一个人骑行,孤单却内省;一群人骑行,壮观而有力。

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

相关文章:

你感兴趣的文章:

标签云: