筛子法求质数

给你一个自然数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;
    }

//还有一种思路:

任一大于2的偶数,都可表示成两个素数之和

所以6到N内的所有偶数都是由两个奇素数相加得到的(素数只有一个是偶数(废话= =))

所以只要对于每一个偶数,看它的两个奇素数是不是都在6,N里面就行了。

具体的对于一个偶数k,如果他可以由两个奇素数组成,且这两个奇素数没有一个是3或者5,那么这个偶数就是我们要找的偶数了

如果包含3或者5,那么只能通过不断枚举6,N内的素数进行判断了。

点赞