算法题:给你一个自然数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万需要遍历。。
对于给定的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]之内的所有素数中, 两两之和为偶数的那些偶数。
- 给你一个自然数N,求[6,N]之内的所有素数中,两两之和为偶数的那些偶数。
- [经典面试题]给你一个自然数N,求[6,N]之内的所有素数中,两两之和为偶数的那些偶数
- 给你一个自然数N,求[6,N]之内的所有素数中,两两之和为偶数的那些偶数(百度2014,面试)
- 算法题:给你一个自然数N,求[6, N]之内的全部素数中, 两两之和为偶数的那些偶数。
- 给你一个自然数N,求[6,N]之内的所有素数中,两两之和为偶数的那些偶数
- Console-算法-一个偶数总能表示为两个素数之和
- 找出MXN数组中所有不相邻元素,并求出它们的和(相邻的数:前一个数是偶数,后一个数是素数)
- 判断101-200之间有多少个素数,并输出所有素数。素数为一个大于1的自然数,除了1和它本身外,不能被其他自然数整除。
- 假设一个数组A[n]数据均为整形,设计一个O(n)的算法,实现将所有奇数放在数组左侧,所有偶数放在右侧
- 输入一个整数数组,返回所有元素两两之差绝对值最小的值,O(n)算法
- 算法题:将一个数组中所有奇数放前面和偶数放后面(不开辟新的内存空间)
- 输入一个偶数N,输出所有素数对之和等于N的素数对
- 20171207编写一个程序,只接受正整数的输入,然后显示所有小于或等于该数的素数。
- 用户输入一个整数,然后显示所有小于或等于该数的素数!
- 华为OJ基础篇-查找组成一个偶数最接近的两个素数
- Interview Q&A - 在一个圆圈里有有限个点(数量一定为偶数),是否一定可以找到一条直线不穿过任意一个点并且把所有的点平分成两半?
- 一串首尾相连的珠子(m个),有N种颜色(N《=10),设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短。并分析时间复杂度与空间复杂度。
- 华为OJ 查找组成一个偶数最接近的两个素数
- 【华为OJ】【051-查找组成一个偶数最接近的两个素数】