筛子法求质数

来源:互联网 发布:韩顺平php全套视频400 编辑:程序博客网 时间:2024/06/12 01:25

给你一个自然数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内的素数进行判断了。


0 0