给你一个自然数N,求[6,N]之内的所有素数中,两两之和为偶数的那些偶数。
#include<iostream>
using namespace std;
//筛子法求质数 可以参考亲和数
//6~N的质数,打印两两质数为偶数的所有这些偶数
//因为质数除开2以外都是奇数,那么大于6的偶数都是奇数,那么把6~N之间的质数都求出来,打印两两的和就可以了。
int main(){
cout << "输入N,产生的质数不大于范围 (6~N): ";
int n;
cin >> n ;
int *array = new int[n+n+1];// 定义array是一个数组指针
//init
for (int i = 0; i <= n+n ; i++)
array[i]=i;
for(int i =2; i*i <= n; i++)
for(int j=i+i; j <= n ; j+=i)
array[j]=0;
int count=0; //统计质数的个数
for (int i = 6; i <= n ; i++){
if(array[i] == i){
cout << array[i]<< " ";
count++;
}
}
cout<<endl<<"一共有"<<count<<"个质数";
cout <<endl<<"打印所有两两和为偶数,打印所有偶数 "<<endl;
//打印 两两之和为偶数的所有偶数
for (int i = 6; i <= n ; i++){
for (int j = i+1; j <= n ; j++)
if(array[i] == i&&array[j] == j){
int sum= array[i] + array[j];
array[sum]=1;
}
}
for (int i = 6+6; i <=n + n ; i++){
if(array[i] == 1)
cout << i << " ";
}
system("pause");
return 0;
}
//还有一种思路:
所以6到N内的所有偶数都是由两个奇素数相加得到的(素数只有一个是偶数(废话= =))
所以只要对于每一个偶数,看它的两个奇素数是不是都在6,N里面就行了。
具体的对于一个偶数k,如果他可以由两个奇素数组成,且这两个奇素数没有一个是3或者5,那么这个偶数就是我们要找的偶数了
如果包含3或者5,那么只能通过不断枚举6,N内的素数进行判断了。