【题目】
给你一个自然数N,求[6,N]之内的所有素数中,两两之和为偶数的那些偶数
---------百度校招
【分析】
1.对于给定的N,我们可以用筛法求素素数的方法在O(n)的时间复杂度内求出所有的素数。
2.除2之外,所有的素数相加都为偶数,所以求出6~N之间的素数,打印两两的和就可以,时间复杂度O(n^2)
【代码】
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAX = 1000001;
int Mark[MAX];
int Prime[MAX];
// 刷法求素数
void IsPrime(){
int index = 0;
// 初始化
memset(Mark,0,sizeof(Mark[0])*MAX);
for(int i = 2;i <= MAX;i++){
//如果未标记则得到一个素数
if(Mark[i] == 0){
Prime[index++] = i;
}//if
//标记目前得到的素数的i倍为非素数
for(int j = 0;j < index,Prime[j] * i <= MAX;j++){
Mark[Prime[j]*i] = 1;
// prime数组 中的素数是递增的,当 i 能整除 prime[j],
// 那么 i*prime[j+1] 这个合数肯定被 prime[j] 乘以某个数筛掉
if(i % Prime[j] == 0){
break;
}//if
}//for
}//for
}
void PrimeSum(int n){
int sum;
int* array = (int*)malloc(sizeof(int)*(2*n));
// 初始化
memset(array,0,sizeof(array[0])*(2*n+1));
// 统计
for(int i = 6;i <= n;i++){
// 非素数
if(Mark[i] == 1){
continue;
}
for(int j = i+1;j <= n;j++){
// 非素数
if(Mark[j] == 1){
continue;
}
sum = i+j;
// 两两之和为偶数的那些偶数
if(array[sum] == 0){
array[sum] = 1;
}//if
}//for
}//for
// 输出两两之和为偶数的那些偶数
for(int i = 18;i <= (n+n);i++){
if(array[i]){
cout<<i<<endl;
}//if
}//for
}
int main(){
//筛法求素数
IsPrime();
// 两两之和为偶数的那些偶数
PrimeSum(11);
return 0;
}